MySQL GROUP_CONCAT与COALESCE有关NULL值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL GROUP_CONCAT与COALESCE有关NULL值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3574字,纯文字阅读大概需要6分钟。
内容图文
更新
我只是注意到服务器中的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`
两者都可以在本地计算机上正常工作,但只能在服务器上运行第一个.在本地计算机上,使用1st或2nd选项(使用var_dump())时,我会得到正确数量的空数组值.在服务器上,如果任何table3_note上都没有值(查询中未显示很多table3_id和其他字段),则第二个选项仅返回一个空数组.
那么问题是为什么呢?如果手册中没有非空值,则这两个函数均声明返回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客户端API版本5.1.44
>服务器:MySQL客户端API版本5.0.51a
答案是否是如此简单,以至于服务器像我的本地计算机一样处理COALESCE函数,但是由于不匹配的MySQL客户端API版本,GROUP_CONCAT函数的处理方式有所不同?
我现在有一个可行的解决方案,因此从某种意义上说这不是一个真正的问题,我需要解决此问题.我只想知道为什么会这样.像我正在使用的那样使用COALESCE有什么陷阱吗?使用for循环打印数组时,是否存在数组未正确同步的危险? (至少快速测试没有发现任何问题.)
最后的笔记.我尝试使用这些和其他一些方法(IFNULL,IS NULL等),例如在以下问题中建议的方法:
> GROUP_CONCAT return NULL if any value is NULL
> Rows with null value for group_concat not returned
但是结果是一样的:可以在本地计算机上运行,??但不能在服务器上运行.以下查询:
//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`
Unless otherwise stated, group functions ignore NULL values.
这是否意味着即使已选中,COALESCE也不会像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`
原始问题保持不变.这非常混乱并且难以理解,但是上面的查询对我有用.
内容总结
以上是互联网集市为您收集整理的MySQL GROUP_CONCAT与COALESCE有关NULL值全部内容,希望文章能够帮你解决MySQL GROUP_CONCAT与COALESCE有关NULL值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。