2013-03-20 2 views
1

У меня есть этот запрос:MySQL: возвращать несколько столбцов из CSV присоединяется

SELECT * 
FROM `test` t 
LEFT JOIN `result` r ON r.test_id = t.id 
LEFT JOIN `parameter` p ON p.test_id = t.id 

, который возвращает:

id    name id test_id  description id test_id   name 
1 test w/o parameters 1  1 the first result NULL NULL   NULL 
1 test w/o parameters 2  1 the second result NULL NULL   NULL 
2 test w/ paramters NULL NULL    NULL 1  2 command_line 
2 test w/ paramters NULL NULL    NULL 2  2  userid 

что я хочу Возвращается:

id    name        results   parameters 
1 test w/o parameters the first result,the second result     NULL 
2 test w/ paramters         NULL command_line,userid 

Я пробовал чтобы заставить GROUP_CONCAT работать, но NULLS отбрасываются. Есть ли способ убедить GROUP_CONCAT в возврате нулей?

Что я действительно хотел бы иметь что-то вроде этого, но это все не так:

SELECT * , group_concat(r.description), group_concat(p.name) 
    FROM `test` t 
    left join `result` r on r.test_id = t.id 
    left join `parameter` p on p.test_id = t.id 

Это возвращает непустые строки:

SELECT * , group_concat(r.description) 
    FROM `test` t 
    LEFT JOIN `result` r on r.test_id = t.id 
    LEFT JOIN `parameter` p on p.test_id = t.id 
+0

Когда один из сцепленных значений NULL, GROUP_CONCAT возвращает другие значения и игнорирует, что, когда все они являются NULL возвращает NULL. Что вы понимаете под «убедить GROUP_CONCAT в возврате нулей»? – jurgenreza

ответ

1

Это, вероятно, будет легче сначала объединяют значения в подзапрос, а затем объединяют их в родительскую таблицу (DEMO):

SELECT t.id, t.name, r.results, p.parameters 
FROM `test` t 
LEFT JOIN (select test_id, group_concat(result) results 
      from `result` r group by test_id) r ON r.test_id = t.id 
LEFT JOIN (select test_id, group_concat(name) parameters 
      from `parameter` p group by test_id) p ON p.test_id = t.id; 

Результат:

| ID |    NAME |       RESULTS |   PARAMETERS | 
--------------------------------------------------------------------------------------- 
| 1 | test w/o parameters | the first result,the second result |    (null) | 
| 2 | test w/ paramters |        (null) | command_line,userid | 
+0

Это отлично. Один вопрос - ограничены ли подсекции? Если в 'results' будет 1 миллион строк, будет создан огромный набор, чтобы извлечь только одну соответствующую строку? – SecondGear

+0

@SecondGear: Я действительно не знаю ответа на это. Вам нужно будет изучить план выполнения или провести некоторое тестирование. – mellamokb

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