2012-02-29 113 views
6

昨天我问了一个问题,关于如何将多个结果放入一个字段并给出了答案GROUP_CONTACT()GROUP_CONCAT用分隔符拉出空结果

我已经把它放到我的代码中,它工作正常。我需要为两个字段执行此操作,因此我现在已经开始在同一个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 

我检查,看看是否有在size2个空格或任何东西,没有什么在那里。

我这样做的查询和产品回来如我所料:

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

当我做这个查询,再没回来:

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

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

回答

16
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 
2

试试这个:

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 
0

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

DISTINCT将消除所有重复项,只有一次发生""

7

您还可以使用NULLIF()功能为空字符串转换为空值:

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 
;