2013-10-28 65 views
0

所以,這裏基本上是這個問題:

對於初學者,我不是要求任何人做我的功課,而只是給我一個正確的方向推動。

我有2個表格,包含練習的名稱和聯繫人數據
我們稱這些表爲peoplecontact

people創建表:
MySQL CONCAT多個獨特的行

CREATE TABLE`people`(
`id` INT(10)無符號NOT NULL AUTO_INCREMENT,
`fname` TINYTEXT,
`mname` TINYTEXT,
`lname` TINYTEXT,
PRIMARY KEY(`id`)
)ENGINE = InnoDB的默認字符集= LATIN1

contact創建表:

CREATE TABLE`contact`(
`id` INT(10)無符號NOT NULL AUTO_INCREMENT,
`person_id` INT(10)無符號NOT NULL DEFAULT「0 」,
`tel_home` TINYTEXT,
`tel_work` TINYTEXT,
`tel_mob` TINYTEXT,
`email`文本,
PRIMARY KEY(`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;

這只是創建類似這樣的回覆:

 
+----+----------+---------------------+----------+---------+---------------------+ 
| id | name  | tel_home   | tel_work | tel_mob | email    | 
+----+----------+---------------------+----------+---------+---------------------+ 
| 1 | Jane Doe | 1500 (xxx-xxx 1500) | NULL  | NULL | [email protected] | 
| 2 | John Doe | 1502 (xxx-xxx 1502) | NULL  | NULL | NULL    | 
| 2 | John Doe | NULL    | NULL  | NULL | [email protected] | 
+----+----------+---------------------+----------+---------+---------------------+ 

該視圖的問題在於第1行和第2行(從0開始計數)可能已被分組到單個行。 儘管這種「不美觀」的結果是由於數據損壞造成的,但它很可能會出現在多節點數據庫環境中。

有針對性的結果會是這樣的

 
+----+----------+---------------------+----------+---------+---------------------+ 
| id | name  | tel_home   | tel_work | tel_mob | email    | 
+----+----------+---------------------+----------+---------+---------------------+ 
| 1 | Jane Doe | 1500 (xxx-xxx 1500) | NULL  | NULL | [email protected] | 
| 2 | John Doe | 1502 (xxx-xxx 1502) | NULL  | NULL | [email protected] | 
+----+----------+---------------------+----------+---------+---------------------+ 

,因爲具有相同idname行時仍表現出的有效數據進行分組。

附註:
innodb_version:5.5.32
版本:5.5.32-0ubuntu-.12.04。1日誌
version_compile_os:debian_linux-GNU

+0

如果兩個或兩個以上「組」中的記錄包含衝突數據? – eggyal

+0

非NULL值不應與其他非NULL值組合在一起 – finwo

回答

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 
+0

基本上,它的工作原理是,當一個組內出現多個非NULL值時,它將成爲逗號分隔列表。 (這很容易在程序語言中修復,但我從未提及過) – finwo