1

我有这种格式的表格:

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

我必须选择那些标签,它们存在于每个项目的一组项目中。

例如:

items={2,3} --> tags{2,3},item 2有tags 2,3,item 3有tags 2,3,常见的tags是2,3

items={1,2,3} --> tags{},item 1有tags 1,3,item 2有tags 2,3,item 3有tags 2,3,常用标签是3

items={1,3} --> tags{3},item 1有tags 1,3,item 3有tags 2,3,常见的tags是3

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

感谢您的回复。

4

2 回答 2

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

于 2012-09-17T14:31:17.967 回答
0

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

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

例如对于项目 {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;

希望能帮助到你...

于 2012-09-17T14:04:41.073 回答