Concat多行也在它们不存在时

时间:2014-09-25 09:29:05

标签: php mysql sql concatenation 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)

2 个答案:

答案 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