Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何从单个表中找到类似的标记组合?_Mysql_Sql_Schema - Fatal编程技术网

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
ad
101
。有没有办法做到这一点?我是否需要其他表/我是否可以使用当前模式实现这一点?我使用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;