更新
我刚刚注意到,在服务器中,列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
) 将 s 检索NULL
为空字符串,第二个查询NULL
从结果集中删除所有值。(这是不可接受的,因为我有很多数组,它们需要同步。)
由于我的错误,原来的问题得到了解决。我仍然想知道为什么即使选中也会GROUP_CONCAT
忽略s 。NULL
这是正常工作的查询(不剥离NULL
s):
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
s呢?(更多忽略值的查询选项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
s 和其他字段)。
那么问题是为什么?NULL
如果根据手册没有非空值,这两个函数都声称返回。
- http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce
- http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
以下信息是否相关,或者我是否遗漏了手册中的某些内容?
- 本地机器:MySQL Client API 版本 5.1.44
- 服务器:MySQL 客户端 API 版本 5.0.51a
答案是否如此简单,以至于服务器COALESCE
像我的本地机器一样处理函数,但GROUP_CONCAT
由于 MySQL 客户端 API 版本不匹配,函数的处理方式不同?
我现在有一个可行的解决方案,所以从某种意义上说,这不是一个真正的问题,我需要解决这个问题。我只是想知道为什么会这样。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
这仍然不能解释服务器和本地机器的不同行为。或者是吗?