MySQL CONCAT多个唯一行

时间:2013-10-28 15:31:57

标签: mysql

所以,这里基本上是问题:

首先,我不是要求任何人做我的作业,而是要给我一个正确方向的推动。

我有2个表格,包含用于练习的姓名和联系方式 我们称这些表为peoplecontact

people

创建表格
  

创建表`人`(
  `id` int(10)unsigned NOT NULL AUTO_INCREMENT,
  `fname` tinytext,
  `mname` tinytext,
  `lname` tinytext,
  PRIMARY KEY(`id`)
  )ENGINE = InnoDB DEFAULT CHARSET = latin1

contact

创建表格
  

CREATE TABLE`contact`(
  `id` int(10)unsigned NOT NULL AUTO_INCREMENT,
  `person_id` int(10)unsigned NOT NULL DEFAULT'0',
  `tel_home` tinytext,
  `tel_work` tinytext,
  `tel_mob` tinytext,
  `email` text,
  PRIMARY KEY(`id`,`person_id`),
  KEY`fk_contact`(`person_id`),
  约束`fk_contact` FOREIGN KEY(`person_id`)REFERENCES`people`(`id`)
  )ENGINE = InnoDB DEFAULT CHARSET = latin1

在获取每个人的联系信息时,我使用的查询如下:
SELECT p.id, CONCAT_WS(' ',p.fname,p.mname,p.lname) name, c.tel_home, c.tel_work, c.tel_mob, c.email;

这仅仅会产生如下响应:

+----+----------+---------------------+----------+---------+---------------------+
| id | name     | tel_home            | tel_work | tel_mob | email               |
+----+----------+---------------------+----------+---------+---------------------+
|  1 | Jane Doe | 1500 (xxx-xxx 1500) | NULL     | NULL    | janedoe@example.com |
|  2 | John Doe | 1502 (xxx-xxx 1502) | NULL     | NULL    | NULL                |
|  2 | John Doe | NULL                | NULL     | NULL    | johndoe@example.com |
+----+----------+---------------------+----------+---------+---------------------+

此视图的问题是第1行和第2行(从0开始计数)可能已被分组为单行。 尽管这种“非漂亮”结果是由于数据损坏导致的,但这很可能发生在多节点数据库环境中。

目标结果类似于

+----+----------+---------------------+----------+---------+---------------------+
| id | name     | tel_home            | tel_work | tel_mob | email               |
+----+----------+---------------------+----------+---------+---------------------+
|  1 | Jane Doe | 1500 (xxx-xxx 1500) | NULL     | NULL    | janedoe@example.com |
|  2 | John Doe | 1502 (xxx-xxx 1502) | NULL     | NULL    | johndoe@example.com |
+----+----------+---------------------+----------+---------+---------------------+

当仍然显示有效数据时,对具有相同idname的行进行分组的情况。

附注:
innodb_version:5.5.32
版本:5.5.32-0ubuntu-.12.04.1-log
version_compile_os:debian_linux-gnu

1 个答案:

答案 0 :(得分:0)

您可以使用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