我有这种格式的表格:
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
作为输入,我有一组项目。我不知道如何编写这样的查询。
感谢您的回复。
答案 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。
答案 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;
希望它有所帮助...