我有一张如下表格
=====================
item| flavor
====+================
111 | amaretto
111 | blueberry
222 | amaretto
333 | blueberry
333 | chocolate
444 | chocolate
444 | amaretto
555 | chocolate
666 | blueberry
666 | amaretto
666 | chocolate
777 | pastry
777 | blueberry
777 | amaretto
777 | chocolate
888 | amaretto
888 | chocolate
999 | chocolate
999 | blueberry
999 | amaretto
101 | amaretto
101 | blueberry
=====================
列item
表示冰淇淋的名称,flavor
列表示其中包含的风味组合。如果我没有必要的话,我希望我的数据库能够为我提供备用冰淇淋。例如,如果我正在查看项目111,我想要111
和101
,它们具有完全相同的风味组合。我有一个类似的查询
SELECT item
FROM `mytable`
GROUP BY item
HAVING SUM(tag = 'amaretto') > 0
AND SUM(tag = 'blueberry ') > 0
但它返回的结果如;
111
666
777
999
101
这是因为所有这些记录中都包含amaretto
和blueberry
。但对于666
,777
和999
,其中还有其他风格。我不想显示它们。相反,我只想要111
ad 101
。有没有办法实现这个目标?我是否需要其他表/我可以使用当前架构实现此目的吗?我使用PHP + MySQL。
谢谢。
答案 0 :(得分:1)
mysqli_free_result
即。添加SELECT item
FROM `mytable`
GROUP BY item
HAVING SUM(tag = 'amaretto') > 0
AND SUM(tag = 'blueberry ') > 0
and sum(tag not in ('amaretto','blueberry ')) = 0
以确保不包含其他任何风味。
答案 1 :(得分:0)
使用聚合函数GROUP_CONCAT,您可以获得每个项目的flavor列表。然后,您可以查找重复列表并显示关联的项目列表。
select flavors, group_concat(item order by item) as items
from
(
select item, group_concat(tag order by tag) as flavors
from mytable
group by item
) items_with_flavorlist
group by flavors
having count(*) > 1;