2012-01-09 2 views
4

Пусть у меня есть кулинарное шоу:конкатенации строк по отношению к РЕГИСТРИРУЙТЕСЬ

cookingepisodes 
id | date 
--------------- 
1 | A 
2 | B 
3 | C 
4 | D 
… 

Это шоу обзоры продуктов в этих категориях (слева) и связаны между собой с помощью таблицы справа:

tests    testitems 
id | name   id | episodeid | testid | name 
------------  ------------------------------------ 
1 | cutlery  1 | 1   | 1  | Forks 
2 | spices   2 | 2   | 1  | Knives 
        3 | 4   | 1  | Spoons 
        4 | 4   | 2  | Oregano 

Мой желаемый результат заключается в следующем:

showid | testid | testname 
    4 | 1,2 | cutlery, spices 
    3 | NULL | NULL 
    2 | 1  | cutlery 
    1 | 1  | cutlery 

Я пробовал используя этот запрос, и он работает до тех пор, пока мне не нужно конкатенировать результаты (когда в одном эпизоде ​​есть два теста). Тогда объединение создаст несколько строк на основе количества

SELECT DISTINCT e.*, i.testid, t.name AS testname 
FROM cookingepisodes AS e 
LEFT OUTER JOIN testitems AS i ON i.episodeid = e.id 
LEFT OUTER JOIN tests AS t ON i.testid = t.id 
ORDER BY e.date DESC 

Я также попытался что-то вроде этого, но я не могу заставить его работать из-за ссылки наружного блока (e.id):

JOIN (
    SELECT GROUP_CONCAT(DISTINCT testid) 
    FROM testitems 
    WHERE testitems.episodeid = e.id 
) AS i 

Любые советы о том, как я могу решить эту проблему без реструктуризации базы данных?

ответ

6

Попробуйте один -

SELECT 
    ce.id showid, 
    GROUP_CONCAT(te.testid) testid, 
    GROUP_CONCAT(t.name) testname 
FROM cookingepisodes ce 
    LEFT JOIN testitems te 
    ON te.episodeid = ce.id 
    LEFT JOIN tests t 
    ON t.id = te.testid 
GROUP BY 
    ce.id DESC; 
+0

Отлично! Я попробовал это, но я не «GROUP BY», поэтому, я думаю, это была моя проблема. Большое спасибо! – Eikern

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