mysql left join subselect

时间:2012-09-17 13:15:26

标签: mysql database select

我有这种格式的表格:

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

我必须选择那些标签,这些标签存在于每一个标签中。

例如:

items = {2,3} - >标签{2,3},第2项标签为2,3,第3项标签为2,3,普通标签为2,3

items = {1,2,3} - >标签{},第1项标签为1,3,第2项标签为2,3,第3项标签为2,3,常用标签为3

items = {1,3} - >标签{3},第1项标签为1,3,第3项标签为2,3,普通标签为3

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

感谢您的回复。

2 个答案:

答案 0 :(得分: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有标签2和3。

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

答案 1 :(得分:0)

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

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

e.g。对于项目{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;

要查看以逗号分隔的结果,请使用以下查询

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;

希望它有所帮助...