2

我有 3 张桌子:table1、table2 和 table3

我从 table1 进行选择查询,它 LEFT JOINS 其他两个表。在选择中,我有一个 group_concat,它从 table3 中获取一个值。一切正常,直到不存在具有特定行的行。group_concat 列表变为空。相反,我希望它将 group_concat 中的值设置为 NULL 用于行不存在的那些。

就像我说的,如果 table2 中的所有行都存在 table3 中的值,那么它就可以工作。如果不是,则整个 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
4

2 回答 2

1

通过更改修复它

IF(COUNT(table3.ext) = COUNT(*), GROUP_CONCAT(table3.ext), NULL) as group2

GROUP_CONCAT(IFNULL(table3.ext, NULL)) as group2
于 2013-01-05T18:49:40.783 回答
0

在您使用联接的情况下,在联接中使用派生子查询并使用 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

也尝试使用派生的子查询

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    
于 2013-01-05T18:06:52.397 回答