所以,这里基本上是问题:
首先,我不是要求任何人做我的作业,而是要给我一个正确方向的推动。
我有2个表格,包含用于练习的姓名和联系方式
我们称这些表为people
和contact
。
为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 | +----+----------+---------------------+----------+---------+---------------------+
当仍然显示有效数据时,对具有相同id
和name
的行进行分组的情况。
附注:
innodb_version:5.5.32
版本:5.5.32-0ubuntu-.12.04.1-log
version_compile_os:debian_linux-gnu
答案 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