如何从标签和项目表中获取所有可能的组合?

时间:2015-11-24 09:52:30

标签: php mysql database

我有一张如下表格

============
item | tag
-----+------
111  | amaretto
-----+------
111  | blueberry
-----+------
222  | amaretto
-----+------
333  | blueberry
-----+------
333  | chocolate
-----+------
444  | chocolate
-----+------
444  | amaretto
-----+------
555  | chocolate
-----+------
666  | blueberry
-----+------
666  | amaretto
-----+------
666  | chocolate
============

itemtag一起构成复合主键。让我们想象像冰淇淋一样的项目和可用的味道标签。例如,如果我搜索amaretto(在冰淇淋的情况下),我想显示所有可能的组合,其中有amaretto冰淇淋,如amaretto,amaretto +巧克力,蓝莓+ amaretto等。如果我搜索标签{ {1}},我想显示所有可能的组合,例如;

amaretto

组合amaretto (222) amaretto,blueberry (111) amaretto,chocloate (444) amaretto,blueberry,chocolate (666) amaretto,blueberry相同。

我该怎么做?我需要额外的桌子吗?我使用PHP + MySQL。

3 个答案:

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

请注意,多个相同的组合可以表示缺乏正常化。