2012-09-17 53 views
1

我有表格式如下:MySQL的左连接的子查询

tag | item 
---------- 
1 | 1 
2 | 2 
2 | 3 
3 | 1 
3 | 2 
3 | 3 

我必须选择这些标签,这是目前在集它的每一个项目。

例如:

项= {2,3} - >代码{2,3},第2项具有标记2,3,第3项有标签2,3,共同标记为2,3-

items = {1,2,3} - > tags {},item 1 has tags 1,3,item 2 has tags 2,3,item 3 has tags 2,3,common tags are 3

items = {1,3} - > tags {3},item 1 has tags 1,3,item 3 has tags 2,3,common tags are 3

作为输入,我有一组项目。我不知道如何编写这样的查询。

感谢您的回复。

+0

因此,你给出了一个项目列表,你想要该列表的通用标签?或者只是一个项目和通用标签的列表? – gbn

+0

我有一个项目列表,并希望有一个共同的标签 – user1677674

回答

0

查询解决你的问题是(假设标签和项目没有重复的条目)

SELECT tag FROM <table_name> 
WHERE item IN (<items to be searched seperated by ,>) 
GROUP BY tag 
HAVING COUNT(*) = <number of items>; 

例如对于下面的查询

SELECT GROUP_CONCAT(a.tag) FROM (
SELECT tag FROM <table_name> 
WHERE item IN (<items to be searched seperated by comma>) 
GROUP BY tag 
HAVING COUNT(*) = <no. of items>) AS a; 

希望它可以帮助项目{1,3}

SELECT tag FROM <table_name> 
WHERE item IN (1,3) 
GROUP BY tag 
HAVING COUNT(*) = 2; 

物品{1,2,3}

SELECT tag FROM <table_name> 
WHERE item IN (1,2,3) 
GROUP BY tag 
HAVING COUNT(*) = 3; 

对于用逗号分隔的使用效果看。 ..

1

我认为你正在寻找共享相同标记的项目列表,对吧?

此查询应该为您做。它由内部摘要查询组成,内部摘要查询将每个项目的标签分组在一起,然后是将共享标签组的项目组合在一起的外部摘要查询。

SELECT GROUP_CONCAT(item ORDER by ITEM) items, tags 
    FROM (
      SELECT GROUP_CONCAT(tag ORDER BY tag) tags, item 
      FROM tbl 
     GROUP BY item 
     )t 
    GROUP BY tags 
    ORDER BY tags 

它返回,为您的测试数据集,你的问题:

| ITEMS | TAGS | 
---------------- 
|  1 | 1,3 | 
| 2,3 | 2,3 | 

也就是说,你的第1项有标签1和3。你的第二和第三项有标签2和3

小提琴! http://sqlfiddle.com/#!2/6a927/3/0

+0

我有一个项目列表,我想知道,哪些项目共享相同的标签,我没有寻找所有的可能性。 – user1677674