Мне нужно объединить несколько значений столбца строки в один столбец. Я знаю, что могу использовать 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)
Примерно так должно работать:
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» может быть лучше, чем временная таблица.
Вы можете использовать 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