我刚注意到,在服务器中,table3.note
列的值为NULL
,而在我的本地计算机上,它们是空字符串。经过这个令人尴尬的发现之后,我做了一些测试,两个平台上的一切都是一样的。
如果我有两个单元格而第二个包含实际值(第一个是NULL
),这就是它们产生的结果:
//1st
GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `table3_note`
//var_dump(): array(2) { [0]=> string(0) "" [1]=> string(4) "Test" }
//2nd
GROUP_CONCAT(`table3`.`note`) SEPARATOR ';') AS `table3_note`
//var_dump(): array(1) { [0]=> string(4) "Test" }
因此,第一个查询(COALESCE
)将NULL
检索为空字符串,第二个查询从结果集中删除所有NULL
个值。 (这是不可接受的,因为我有很多阵列,需要同步。)
由于我的错误,原来的问题已经解决了。我仍然想知道为什么GROUP_CONCAT
忽略NULL
即使被检查了。
这是正常运行的查询(不剥离NULL
):
SELECT `table1`.*
GROUP_CONCAT(COALESCE(`table3`.`id`, '') SEPARATOR ';') AS `t3_id`,
GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `t3_note`,
FROM `table1`
LEFT JOIN `table3` ON `table3`.`id` = `table1`.`id`
GROUP BY `table1`.`id`
那为什么这个忽略了NULL
? (忽略NULL
值的更多查询选项位于原始问题部分。)
SELECT `table1`.*
GROUP_CONCAT(`table3`.`id` SEPARATOR ';') AS `t3_id`,
GROUP_CONCAT(`table3`.`note` SEPARATOR ';') AS `t3_note`,
FROM `table1`
LEFT JOIN `table3` ON `table3`.`id` = `table1`.`id`
GROUP BY `table1`.`id`
我的查询的一部分,它使用三个表(1:n关系,我将多个行从table2
和table3
映射到单个table1
行)。获取单个单元格值的两种方法:
//1st
GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `table3_note`
//2nd
GROUP_CONCAT(`table3`.`note`) SEPARATOR ';') AS `table3_note`
两者都可以在本地计算机上正常工作,但只能在服务器上运行第一个。在我的本地机器上,当使用第一个或第二个选项(使用var_dump()
)时,我得到正确数量的空数组值。在服务器上,如果任何table3_note
上没有值,则第二个选项仅返回一个空数组(查询中未显示许多table3_id
和其他字段)。
所以问题是为什么?如果根据手册没有非空值,两个函数都声称返回NULL
。
以下信息是否相关或我是否遗漏了手册中的内容?
答案是否如此简单以至于服务器像本地机器一样处理COALESCE
函数,但由于MySQL Client API版本不匹配,GROUP_CONCAT
函数的处理方式不同?
我现在有一个有效的解决方案,所以从某种意义上说,这不是一个真正的问题,我需要解决这个问题。我只想知道为什么会这样。使用COALESCE
就像我使用的那样有任何陷阱吗?使用for
循环打印数组时,是否存在阵列未正确同步的危险? (至少快速测试没有发现任何问题。)
最后的笔记。我尝试使用这些和其他一些方法(IFNULL
,IS NULL
等),例如在这些问题中建议:
但结果是一样的:在本地计算机上运行,但在服务器上运行。查询如下:
//another option for the query
IF(SUM(`table3`.`note` IS NULL) = 0, GROUP_CONCAT(`table3`.`note` SEPARATOR ';'), NULL) AS `table3_note`
//and another one...
ISNULL(GROUP_CONCAT(`table3`.`note` SEPARATOR ';'), '') AS `table3_note`
除非另有说明,否则组函数会忽略NULL值。
这是否意味着COALESCE
不会忽略像NULL
这样的GROUP_CONCAT
值,即使已选中了?这仍然没有解释服务器和本地机器的不同行为。或者是吗?
答案 0 :(得分:3)
这是正常运行的查询(不剥离NULL
):
SELECT `table1`.*
GROUP_CONCAT(COALESCE(`table3`.`id`, '') SEPARATOR ';') AS `t3_id`,
GROUP_CONCAT(COALESCE(`table3`.`note`, '') SEPARATOR ';') AS `t3_note`,
FROM `table1`
LEFT JOIN `table3` ON `table3`.`id` = `table1`.`id`
GROUP BY `table1`.`id`
原始问题保持不变。它非常混乱,难以理解,但上面的查询对我有用。