Concat несколько строк также, когда они не существуют

Мне нужно объединить несколько значений столбца строки в один столбец. Я знаю, что могу использовать GROUP_CONCAT для этого. Но это не соответствует моим потребностям. Это мой запрос:

  SELECT
GROUP_CONCAT(twv.value ORDER BY twv.id ASC SEPARATOR ';') as needed_values
FROM table_with_values twv
WHERE twv.valuetype_id IN (9,12,13,15,17,29)
GROUP BY twv.person_id

Проблема заключается в том, что если строка с, например, valuetype_id = 13 не найдена, это значение, конечно, не будет объединено.

Как я могу сделать так, чтобы в случае, когда person_id не имеет значения для valuetype_id = 13, в этой части будет вставлено «-»?

Спасибо

@Giles
Я попробовал вашу идею, а потом немного ее изменил. Протестировал запрос ниже, и он дает мне 5 строк вместо ожидаемых 6 (потому что я остаюсь присоединяющимся ??).

SELECT vid
FROM (SELECT 9 vid UNION SELECT 12 UNION SELECT 13 UNION SELECT 15 UNION SELECT 17 UNION SELECT 29) vids
LEFT JOIN sollicitant_profiel sp1 ON (sp1.vraag_id = vids.vid)
WHERE sp1.sollicitant_id = 1

Тогда как этот работает и дает 6 строк, как и ожидалось:

SELECT vids.vid, vids2.vid
FROM (SELECT 9 vid UNION SELECT 12 UNION SELECT 13 UNION SELECT 15 UNION SELECT 17 UNION SELECT 29) vids
LEFT JOIN (SELECT 9 vid UNION SELECT 12 UNION SELECT 13 UNION SELECT 15 UNION SELECT 17) vids2 ON (vids.vid = vids2.vid)

0

Решение

Примерно так должно работать:

SELECT
GROUP_CONCAT(COALESCE(twv.value,'-') ORDER BY twv.id ASC SEPARATOR ';') as needed_values
FROM table_with_values twv
RIGHT JOIN (SELECT 9 vid UNION SELECT 12 UNION SELECT 13 UNION SELECT 15 UNION SELECT 17 UNION SELECT 29) vids
ON vids.vid = twv.valuetype_id
GROUP BY twv.person_id

Не имея ваших ценностей, я не могу это проверить. Суб-выбор «vids» может быть лучше, чем временная таблица.

0

Другие решения

Вы можете использовать IF_NULL, он возвращает второй параметр ‘-‘, когда GROUP_CONCAT IS NULL.

SELECT
IF_NULL(GROUP_CONCAT(twv.value ORDER BY twv.id ASC SEPARATOR ';'),'-') as needed_values
FROM table_with_values twv
LEFT JOIN (SELECT 9 vid UNION SELECT 12 UNION SELECT 13 UNION SELECT 15 UNION SELECT 17 UNION SELECT 29) vids
ON vids.vid = twv.valuetype_id
GROUP BY twv.person_id
0

По вопросам рекламы [email protected]