我有一个表格,格式如下:
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
作为输入,我有一组项目。我不知道如何编写这样的查询。
感谢您的回复。
发布于 2012-09-17 22:31:18
我想您正在寻找共享相同标签的项目列表,对吧?
此查询应该可以为您完成此操作。它由一个内部摘要查询和一个外部摘要查询组成,前者将每个项目的标签分组在一起,后者将共享标签组的项目分组在一起。
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-17 22:04:41
解决问题的查询是(假设标签和项目没有重复的条目)
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;希望这能帮上忙。
https://stackoverflow.com/questions/12460008
复制相似问题