MySQL CONCAT 多个唯一行

Posted

技术标签:

【中文标题】MySQL CONCAT 多个唯一行【英文标题】:MySQL CONCAT multiple unique rows 【发布时间】:2013-11-07 11:11:15 【问题描述】:

所以,这基本上是问题所在: 首先,我不是要求任何人做我的功课,而是要让我朝着正确的方向轻推。 我有 2 个表格,其中包含用于练习的姓名和联系数据 我们将这些表称为peoplecontact。 为people 创建表:

创建表`people` ( `id` int(10) 无符号 NOT NULL AUTO_INCREMENT, `fname` 小文本, `mname` 小文本, `lname` 小文本, 主键 (`id`) ) ENGINE=InnoDB 默认字符集=latin1

contact 创建表:

创建表`联系人`( `id` int(10) 无符号 NOT NULL AUTO_INCREMENT, `person_id` int(10) unsigned NOT NULL DEFAULT '0', `tel_home` 小文本, `tel_work` tinytext, `tel_mob` 小文本, `电子邮件`文本, 主键(`id`,`person_id`), KEY `fk_contact` (`person_id`), 约束 `fk_contact` 外键 (`person_id`) 参考 `people` (`id`) ) ENGINE=InnoDB 默认字符集=latin1

在获取每个人的联系方式时,我使用的查询如下:SELECT p.id, CONCAT_WS(' ',p.fname,p.mname,p.lname) name, c.tel_home, c.tel_work, c.tel_mob, c.email; 这只会创建如下响应:

+----+----------+---------+----------+ ---------+----------+ |编号 |姓名 |电话首页 |电话工作 |电话暴徒 |电子邮件 | +----+----------+---------+----------+ ---------+----------+ | 1 |简·多伊 | 1500 (xxx-xxx 1500) |空 |空 | janedoe@example.com | | 2 |约翰·多伊 | 1502 (xxx-xxx 1502) |空 |空 |空 | | 2 |约翰·多伊 |空 |空 |空 | johndoe@example.com | +----+----------+---------+----------+ ---------+----------+

此视图的问题在于,第 1 行和第 2 行(从 0 开始计数)可能已被分组为一行。 尽管这种“不漂亮”的结果是由于数据损坏造成的,但这种情况很可能会发生在多节点数据库环境中。 目标结果类似于

+----+----------+---------+----------+ ---------+----------+ |编号 |姓名 |电话首页 |电话工作 |电话暴徒 |电子邮件 | +----+----------+---------+----------+ ---------+----------+ | 1 |简·多伊 | 1500 (xxx-xxx 1500) |空 |空 | janedoe@example.com | | 2 |约翰·多伊 | 1502 (xxx-xxx 1502) |空 |空 | johndoe@example.com | +----+---------+---------+----------+ ---------+----------+

idname 相同的行在仍然显示有效数据时被分组。 旁注: innodb_version:5.5.32 版本:5.5.32-0ubuntu-.12.04.1-log version_compile_os: debian_linux-gnu

【问题讨论】:

如果“组”中的两条或多条记录包含冲突数据怎么办? 非 NULL 值不应与其他非 NULL 值组合在一起 【参考方案1】:

您可以使用GROUP_CONCAT(),它“返回一个字符串结果,其中包含来自组的连接的非NULL”:

SELECT   p.id,
         GROUP_CONCAT(CONCAT_WS(' ',p.fname,p.mname,p.lname)) name,
         GROUP_CONCAT(c.tel_home) tel_home,
         GROUP_CONCAT(c.tel_work) tel_work,
         GROUP_CONCAT(c.tel_mob ) tel_mob,
         GROUP_CONCAT(c.email   ) email
FROM     my_table
GROUP BY p.id

【讨论】:

基本上,它完成了这项工作,只是当一个组内出现多个非空值时,它会变成一个逗号分隔的列表。 (这可以很容易地在程序语言中修复,但我从未提到过)

以上是关于MySQL CONCAT 多个唯一行的主要内容,如果未能解决你的问题,请参考以下文章

使用 HAVING GROUP_CONCAT 计算记录行

使用 MySQL 在不同字段上的多个 GROUP_CONCAT

mysql 组 concat 成多个字段

多个表上的mysql group_concat

MySQL SELECT 从多个表,多个 GROUP BY 和 group_concat?

MySQL 使用 GROUP_CONCAT 和多个 JOINS