2015-11-24 3 views
0

У меня есть таблица, как нижеКак получить все возможные комбинации из таблицы тегов и элементов?

============ 
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 (222) 
amaretto,blueberry (111) 
amaretto,chocloate (444) 
amaretto,blueberry,chocolate (666) 

И комбинации amaretto,blueberry и blueberry,amaretto одинаковы.

Как это сделать? Нужны ли мне дополнительные таблицы? Я использую PHP + MySQL.

+0

Что SQL может сделать, это получить все вкусы данного мороженого, запросив первичный ключ. После того как вы собрали все вкусы, перечисление всех возможных комбинаций зависит от вас. –

+0

@kuroineko у вас есть решение? –

+0

, если вы знаете вероятность, чем я думаю, что у нее есть n вероятность комбинации этого –

ответ

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) 

Обратите внимание, что несколько идентичных комбинаций может быть симптомом отсутствия нормализации.

+0

Я добавил новые записи в свою таблицу, которые можно найти здесь: http://freetexthost.com/40ow4gkf5c, и когда я запускаю запрос, я получаю повторяющиеся результаты, «444 амаретто, шоколад» и «888 шоколад, амаретто», которые одинаковы (независимо от 444 и 888). Вот скриншот https://i.stack.imgur.com/xShne.jpg. Я хочу исключить дубликаты. Как я могу это сделать? –

+0

http://i.stack.imgur.com/4S13O.jpg –

+0

Мы предпочитаем sqlfiddle (когда он работает) – Strawberry

0

Возможно, вы захотите GROUP_CONCAT, а затем с помощью инструкции LIKE.

SELECT * FROM (
SELECT item, GROUP_CONCAT(DISTINCT tag) as TagCombinations 
FROM tbl 
GROUP BY item) A 
WHERE TagCombinations LIKE 'amaretto%' 
+1

Поскольку вы используете предварительную агрегатную фильтрацию, вы удаляете все строки без амаретто. – Mihai

+0

Вы правы, и я его отредактировал. Благодарю. – Edper

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 
+0

@Strawberry Вы правы – Mihai

+0

что такое 't',' tt' и 'ttt'? –

+0

@ blasteralfredΨ Очень имагментативные псевдонимы – Mihai

Смежные вопросы