0

所以,这基本上就是问题所在:

首先,我不是要求任何人做我的功课,而是要让我朝着正确的方向轻推。

我有 2 个表格,其中包含用于练习的姓名和联系人数据
让我们称这些表格peoplecontact.

创建表people

CREATE TABLE `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`),
CONSTRAINT `fk_contact` FOREIGN KEY (`person_id`) REFERENCES `people` (`id`)
) ENGINE=InnoDB DEFAULT字符集=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

4

1 回答 1

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
于 2013-10-28T15:36:25.863 回答