GROUP_CONCAT用分隔符拉出空结果

时间:2012-02-29 10:13:35

标签: php sql

昨天我问了一个关于如何将多个结果提取到一个字段中的问题,并给出了答案GROUP_CONTACT()

我把它放到我的代码中,它工作正常。我需要为两个字段执行此操作,因此我现在已经开始在相同的sql语句中使用它两次。不幸的是,它用逗号清除了第二个字段的空列表,我不太清楚为什么。

以下是我的示例产品数据:

pid || prod
1   || top
2   || sweater

以下是我的样本库存数据(某些库存没有两种尺寸,例如腰围和胸围):

sid || size1 || size2 || pid
1   || M     ||       || 1
2   || L     ||       || 1
3   || XL    ||       || 1
4   || L     ||       || 2
5   || XL    ||       || 2

这是我的代码:

SELECT p.id, GROUP_CONCAT(s.size1) size1, GROUP_CONCAT(s.size2) size2, p.prod
FROM products p JOIN stock s ON s.prodid = p.id

这应该是它应该带来的:

pid || size1  || size2 || prod
1   || M,L,XL ||       || top
2   || L,XL   ||       || sweater

这就是它实际带来的:

pid || size1  || size2 || prod
1   || M,L,XL || ,,    || top
2   || L,XL   || ,     || sweater

我已经检查过是否有空格或任何尺寸为2的东西,而且那里什么都没有。

我做了这个查询,产品按照我的预期回来了:

SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 = ""

当我进行此查询时,没有任何回复:

SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 IS NULL

我知道GROUP_CONCAT()会忽略NULL结果,但我需要做些什么来阻止GROUP_CONTACT()显示一个空的逗号分隔列表,只有""而不是NULL

5 个答案:

答案 0 :(得分:18)

SELECT p.id, GROUP_CONCAT(s.size1) size1, 
GROUP_CONCAT(if (s.size2 ='', null, s.size2)) as size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id

答案 1 :(得分:8)

您还可以使用NULLIF()函数将空字符串转换为NULL:

SELECT
  p.id,
  GROUP_CONCAT(       s.size1     ) AS size1,
  GROUP_CONCAT(NULLIF(s.size2, '')) AS size2,
  p.prod
FROM products AS p
  INNER JOIN stock AS s ON s.prodid = p.id
GROUP BY
  p.id,
  p.prod
;

答案 2 :(得分:3)

试试这个:

SELECT 
    p.id, 
   GROUP_CONCAT(s.size1) size1, 
   GROUP_CONCAT(case when s.size2='' then null else s.size2 end) size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id

答案 3 :(得分:0)

您是否尝试过使用GROUP_CONCAT(DISTINCT column)?根据我对文档的理解,它应该像你想要的那样产生一个空字符串。

DISTINCT将消除所有重复项,只留下一次""

答案 4 :(得分:0)

如果使用NULLIF:

GROUP_CONCAT(NULLIF(au1.email,''),',')

请记住不要放置分隔符(从GROUP_CONCAT函数中删除第二个参数:

GROUP_CONCAT(NULLIF(au1.email,''))