我有一张如下表格
============
item | tag
-----+------
111 | amaretto
-----+------
111 | blueberry
-----+------
222 | amaretto
-----+------
333 | blueberry
-----+------
333 | chocolate
-----+------
444 | chocolate
-----+------
444 | amaretto
-----+------
555 | chocolate
-----+------
666 | blueberry
-----+------
666 | amaretto
-----+------
666 | chocolate
============
列item
和tag
一起构成复合主键。让我们想象像冰淇淋一样的项目和可用的味道标签。例如,如果我搜索amaretto(在冰淇淋的情况下),我想显示所有可能的组合,其中有amaretto冰淇淋,如amaretto,amaretto +巧克力,蓝莓+ amaretto等。如果我搜索标签{ {1}},我想显示所有可能的组合,例如;
amaretto
组合amaretto (222)
amaretto,blueberry (111)
amaretto,chocloate (444)
amaretto,blueberry,chocolate (666)
和amaretto,blueberry
相同。
我该怎么做?我需要额外的桌子吗?我使用PHP + MySQL。
答案 0 :(得分:1)
SELECT tt.item,
GROUP_CONCAT(DISTINCT tt.tag) FROM mytable tt
JOIN mytable ttt
ON tt.item=ttt.item
GROUP BY tt.item
HAVING SUM(tt.tag='yourtag')>0
一种解决方案是GROUP BY GROUP_CONCAT的结果(如果先订购
)SELECT MIN(item),tags FROM
(SELECT tt.item,
GROUP_CONCAT(DISTINCT tt.tag ORDER BY tt.tag) tags FROM mytable tt
JOIN mytable ttt
ON tt.item=ttt.item
GROUP BY tt.item
HAVING SUM(tt.tag='amaretto')>0)x
GROUP BY tags
答案 1 :(得分:0)
您可能需要GROUP_CONCAT,然后使用LIKE语句。
SELECT * FROM (
SELECT item, GROUP_CONCAT(DISTINCT tag) as TagCombinations
FROM tbl
GROUP BY item ) A
WHERE TagCombinations LIKE 'amaretto%'
答案 2 :(得分:0)
SELECT GROUP_CONCAT(DISTINCT a.tag) tags
FROM my_table a
JOIN my_table b
ON b.item = a.item
WHERE b.tag = 'amaretto'
GROUP
BY a.item;
+------------------------------+
| tags |
+------------------------------+
| amaretto,blueberry |
| amaretto |
| amaretto,chocolate |
| amaretto,blueberry,chocolate |
+------------------------------+
4 rows in set (0.00 sec)
要解决OP的修正问题,同一个查询中的罕见DISTINCT和GROUP BY实例......:
SELECT DISTINCT GROUP_CONCAT(a.tag ORDER BY a.tag) tags
FROM mytable a
JOIN mytable b
ON b.item = a.item
AND b.tag <= a.tag
WHERE b.tag = 'amaretto'
GROUP
BY a.item;
+-------------------------------------+
| tags |
+-------------------------------------+
| amaretto,blueberry |
| amaretto |
| amaretto,chocolate |
| amaretto,blueberry,chocolate |
| amaretto,blueberry,chocolate,pastry |
+-------------------------------------+
5 rows in set (0.01 sec)
请注意,多个相同的组合可以表示缺乏正常化。