我需要将多行列值连接到一列中。我知道我可以使用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 :(得分: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" sub-select可能更适合作为临时表。
答案 1 :(得分:0)
你可以使用IF_NULL,它在GROUP_CONCAT为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