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