实际注册 NULL 的 MySQL GROUP_CONCAT?

Posted

技术标签:

【中文标题】实际注册 NULL 的 MySQL GROUP_CONCAT?【英文标题】:MySQL GROUP_CONCAT that actually registers NULLs? 【发布时间】:2011-06-27 07:36:25 【问题描述】:

我有这个大型的、程序生成的 mysql 查询。在此查询的一部分中,我必须将服务器单元格合并到一个单元格中。这是因为该人可能有多个表单条目(在相同数据的情况下,我得到的是汽车、房屋、自行车和婴儿车)。我可以使用 GROUP_CONCAT 使其成为一个字段,每个字段分开,效果很好,但是有一个问题。

有些人没有填写所有信息,所以以汽车为例,有三辆,但一辆 1 有一张照片,恰好是第三辆。所以我所有的结果,但不是按照原来的顺序

我在表格中的内容

身份证号 |所有者编号# |制作 |型号 |年份 |图片 ----+----------+---------+------------+------+----- -------- 1 | 3 |花冠| gt-s | 1986 | 2 | 3 |适合 | V6 | 2001 | 3 | 3 |小明星 |燃气轮机 | 1981 |汽车.jpg 4 | 4 | F-150 |超级责任 | 2010 | 5 | 5 |甲虫| | 1968 |

当我运行 GROUP_CONCAT 查询时,我得到了这个

身份证号 |所有者编号# |制作 |型号 |年份 |图片 ----+------------+---------+------------ +----------------+------------- 1 | 3,3,3 |花冠,合身,小明星| 高分辨率照片| CLIPARTO gt-s,V6,GT | 1986,2001,1981 |汽车.jpg 4 | 4 | F-150 |超级责任 | 2010 | 5 | 5 |甲虫| | 1968 |

但我想得到这个

身份证号 |所有者编号# |制作 |型号 |年份 |图片 ----+------------+---------+------------ +----------------+------------- 1 | 3,3,3 |花冠,合身,小明星| 高分辨率照片| CLIPARTO gt-s,V6,GT | 1986,2001,1981 | ,,汽车.jpg 4 | 4 | F-150 |超级责任 | 2010 | 5 | 5 |甲虫| | 1968 |

注意“carimage.jpg”中的两个逗号

问题似乎集中在查询SELECT GROUP_CONCAT(cfv.value) FROM cf_customfield_values cfv 的第一部分。我已经尝试了一些方法来让它按照我需要的方式运行。

在 GROUP_CONCAT 中使用 IFNULL 将空值更改为其他值 稍微移动一下 IFNULL 看看我是否能得到更好的结果 使用传统的 IF 语句将空值更改为其他值 使用 COALESCE 确保始终至少有 1 个非 NULL 将字符串连接到值的开头和/或结尾,使其始终具有刺痛感,因此不为 NULL 我什至尝试将其设为 GROUP_CONCAT('test'),这清楚地表明其中的内容并不重要,它仍然会意识到它是 NULL,并且不会连接它。

我真正想要这样做的原因是这样我就可以将连接的值分解为子表以进行显示(显然我会使用逗号以外的东西来防止显示脚本部分出现任何可能的错误)。

哇,这比我要长,TLDR;我需要 GROUP_CONCAT 将空值与值连接起来。


完整的 SQL

SELECT *, pregi.ttl AS 'general_information-name' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values proffv LEFT JOIN cf_profiles_fields proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='1') AS 'profile_first_name' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values proffv LEFT JOIN cf_profiles_fields proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='2') AS 'profile_last_name' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values proffv LEFT JOIN cf_profiles_fields proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='3') AS 'profile_e-mail_address' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values proffv LEFT JOIN cf_profiles_fields proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='4') AS 'profile_phone_-_office' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values proffv LEFT JOIN cf_profiles_fields proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='6') AS 'profile_fax' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values proffv LEFT JOIN cf_profiles_fields proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='7') AS 'profile_password' , (SELECT GROUP_CONCAT(DISTINCT '[subtablerow]',CONCAT('[row num="',proffv.profileid,'"]',proffv.value),'[/subtablerow]') FROM cf_profiles_fields_values proffv LEFT JOIN cf_profiles_fields proff ON proffv.fieldid=proff.id LEFT JOIN cf_profiles prof ON prof.id=proffv.profileid WHERE proff.id='9') AS 'profile_phone_-_cell' , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=9 AND cfv.memberid=core.id) AS bicycles_build_material , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=10 AND cfv.memberid=core.id) AS bicycles_color , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=7 AND cfv.memberid=core.id) AS bicycles_frame_size , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=8 AND cfv.memberid=core.id) AS bicycles_wheel_size , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=4 AND cfv.memberid=core.id) AS cars_exterior_color , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=5 AND cfv.memberid=core.id) AS cars_interior_color , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=18 AND cfv.memberid=core.id) AS cars_interior_color , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=17 AND cfv.memberid=core.id) AS cars_license , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=1 AND cfv.memberid=core.id) AS cars_make , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=2 AND cfv.memberid=core.id) AS cars_model , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=14 AND cfv.memberid=core.id) AS cars_picture , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=6 AND cfv.memberid=core.id) AS cars_upholstery_material , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=15 AND cfv.memberid=core.id) AS cars_vehicle_history , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=16 AND cfv.memberid=core.id) AS cars_vin , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=3 AND cfv.memberid=core.id) AS cars_year , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=21 AND cfv.memberid=core.id) AS contact_info_email_address , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=20 AND cfv.memberid=core.id) AS contact_info_fax , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=19 AND cfv.memberid=core.id) AS contact_info_phone , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=22 AND cfv.memberid=core.id) AS contact_info_url , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=13 AND cfv.memberid=core.id) AS strollers_height , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=11 AND cfv.memberid=core.id) AS strollers_seats , (SELECT GROUP_CONCAT(IFNULL(cfv.value,'test') ) FROM cf_customfield_values cfv WHERE fieldid=12 AND cfv.memberid=core.id) AS strollers_wheels FROM cf_members core LEFT JOIN cf_members pregi ON pregi.id=core.id

【问题讨论】:

您希望结果是什么样的?你按什么分组?您的问题中有 2 个“当我运行 GROUP_CONCAT 查询时,我得到 this”,其中有 2 个不同的结果 哎呀,我修好了,得到第一个结果想要第二个 看起来类似于:***.com/questions/26680893/… 【参考方案1】:
group_concat(coalesce(cfv.value, ''))

【讨论】:

不,我已经尝试使用 COALESCE,不起作用,仍然忽略前两个 NULL 字段 你在使用内连接吗?最好发布您的完整 SQL 我正在使用 LEFT JOIN,我会尝试发布我的完整 SQL,但是一旦它由脚本生成,它就会很大而且相当混乱。

以上是关于实际注册 NULL 的 MySQL GROUP_CONCAT?的主要内容,如果未能解决你的问题,请参考以下文章

使用 group_concat 更新 mysql 表

注册错误:android中的null

[MySQL]--MySQL表中某个列插入数据总被截断,报编码方式的语法错误,实际是column的not null属性和更改编码语法导致的冲突。

为啥这个 MySQL 函数返回 null?

MySQL数据写入后显示NULL

如何在 MySQL 中将默认 Null 更改为 NOT NULL