2014-09-25 66 views
0

我需要将多个行列值连接成一列。我知道我可以使用GROUP_CONCAT。但它不符合我的需求。这是我的查询:当它们不存在时,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没有valueetype_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为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 
相关问题