Mysql 如何从单个表中找到类似的标记组合?
我有一张像下面这样的桌子Mysql 如何从单个表中找到类似的标记组合?,mysql,sql,schema,Mysql,Sql,Schema,我有一张像下面这样的桌子 ===================== item| flavor ====+================ 111 | amaretto 111 | blueberry 222 | amaretto 333 | blueberry 333 | chocolate 444 | chocolate 444 | amaretto 555 | chocolate 666 | blueberry 666 | amaretto 66
=====================
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
列表示其中包含的风味组合。我希望我的db给我返回备用冰淇淋,以防我没有所需的冰淇淋。例如,如果我正在查看项目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
ad101
。有没有办法做到这一点?我是否需要其他表/我是否可以使用当前模式实现这一点?我使用PHP+MySQL
多谢各位
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
也就是说,添加
sum(标签不在('amaretto','blueberry'))=0
,以确保不包含任何其他口味。使用聚合功能组,您可以获得每个项目的口味列表。然后可以查找重复列表并显示关联的项目列表
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;