MySQL:GROUP_CONCAT,其中行可能不存在

时间:2013-01-05 17:59:01

标签: mysql null group-concat

我有3张桌子:table1,table2&表3

我从table1中创建一个select查询,其中LEFT JOINS其他两个表。在select中我有一个group_concat,它从table3获取一个值。一切都运行良好,直到具有特定行的行不存在。 group_concat列表变为空。相反,我希望它将group_concat中的值设置为NULL,以用于行不存在的值。

就像我说的,如果表3中的值存在于table2中的所有行,那么它就可以工作。如果没有,整个group_concat都是空的。

到目前为止我得到的一些“简化”代码:

SELECT 
    table1.table2Id,
    table1.dateAdded,

IF(COUNT(table2.table3Id) = COUNT(*), GROUP_CONCAT(table2.table3Id), NULL) as group1,
IF(COUNT(table3.ext) = COUNT(*), GROUP_CONCAT(table3.ext), NULL) as group2
FROM table1
LEFT JOIN table2 ON
    table2.id = table1.table2Id
LEFT JOIN table3 ON
    table3.id = table2.table3Id

2 个答案:

答案 0 :(得分:1)

通过更改

来修复它
IF(COUNT(table3.ext) = COUNT(*), GROUP_CONCAT(table3.ext), NULL) as group2

GROUP_CONCAT(IFNULL(table3.ext, NULL)) as group2

答案 1 :(得分:0)

在您使用联接的情况下,在连接中使用derieved子查询并使用IFNULL并将其默认值设置为0,然后在外部表中,如果出现空值,将使用此值(0)。

编辑:

由于没有可测试的数据,您可以这样做。使用INNER JOIN而不是左连接。

SELECT 
    table1.table2Id,
    table1.dateAdded,

IF(COUNT(table2.table3Id) = COUNT(*), GROUP_CONCAT(table2.table3Id), NULL) as group1,
IF(COUNT(table3.ext) = COUNT(*), GROUP_CONCAT(table3.ext), NULL) as group2
FROM table1
INNER JOIN table2 ON
    table2.id = table1.table2Id
INNER JOIN table3 ON
    table3.id = table2.table3Id

还尝试使用derieved子查询

SELECT 
    table1.table2Id,
    table1.dateAdded,
    IF(COUNT(t2.table3Id) = COUNT(*), GROUP_CONCAT(t2.table3Id), NULL) as group1,
    IF(COUNT(table3.ext) = COUNT(*), GROUP_CONCAT(table3.ext), NULL) as group2
FROM table1
LEFT JOIN (
            SELECT 
                id,
                IFNULL(table3Id,0) as table3Id,
                table3Id
            FROM table2
            GROUP BY id table3Id
            )as t2 ON t2.id = table1.table2Id
INNER JOIN table3 ON table3.id = t2.table3Id