如何从单个表中找到类似的标签组合?

时间:2015-11-25 10:02:31

标签: 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
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,我想要111101,它们具有完全相同的风味组合。我有一个类似的查询

SELECT item
FROM `mytable`
GROUP BY item
HAVING SUM(tag = 'amaretto') > 0
   AND SUM(tag = 'blueberry ') > 0

但它返回的结果如;

111
666
777
999
101

这是因为所有这些记录中都包含amarettoblueberry。但对于666777999,其中还有其他风格。我不想显示它们。相反,我只想要111 ad 101。有没有办法实现这个目标?我是否需要其他表/我可以使用当前架构实现此目的吗?我使用PHP + MySQL。

谢谢。

2 个答案:

答案 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;