2011-05-13 20 views
0

我需要一些認真的幫助。這是... 假設我有一個'用戶'表中的字段(userId,name)。現在我需要從與此用戶有關的其他表中獲取多項信息。有些項目是相似的,所以需要捆綁在一起。從mysql數據庫中選擇多個表(在單個字段中返回多個項目)

現在我也有其他幾個表:

CREATE TABLE app.phones (
`id` INT NOT NULL AUTO_INCREMENT , 
`userId` INT NOT NULL , 
`phone` VARCHAR(16) NOT NULL , 
PRIMARY KEY (`id`) 
) ENGINE = InnoDB; 

CREATE TABLE app.emails (
`id` INT NOT NULL AUTO_INCREMENT , 
`userId` INT NOT NULL , 
`email` VARCHAR(32) NOT NULL , 
PRIMARY KEY (`id`) 
) ENGINE = InnoDB; 

CREATE TABLE app.contact_methods (
`id` INT NOT NULL AUTO_INCREMENT , 
`userId` INT NOT NULL , 
`method` ENUM('phone', 'email') NOT NULL, 
`methodId` INT NOT NULL , 
PRIMARY KEY (`id`) 
) ENGINE = InnoDB; 

CREATE TABLE app.groups (
`id` INT NOT NULL AUTO_INCREMENT , 
`groupName` VARCHAR(16) NOT NULL , 
PRIMARY KEY (`id`) 
) ENGINE = InnoDB; 

CREATE TABLE app.users_groups (
`id` INT NOT NULL AUTO_INCREMENT , 
`userId` INT NOT NULL , 
`groupId` INT NOT NULL , 
PRIMARY KEY (`id`) 
) ENGINE = InnoDB; 

正如你可能已經猜到,每個用戶可以擁有多個電子郵件地址,電話和是多個組的一部分。如何使用上面的所有表格顯示下面的表格?

+---------+-------------+-------------------+--------------+ 
|name  |phones  |emails    |groups  | 
+---------+-------------+-------------------+--------------+ 
|John Doe |123-555-0101,|[email protected], |group1,group2,| 
|   |123-555-0909 |[email protected] |group3  | 
+---------+-------------+---------+---------+--------------+ 

UPDATE:電子郵件和電話,不應該從他們的表立即採取。表contact_methods包含引用這些表的條目。

回答

2

嘗試此大小

SELECT u.name, ph.phone, em.email, gr.groupName 
FROM users AS u, phones AS ph, emails AS em, groups AS gr 
WHERE (u.id = ph.userId) 
    AND (u.id = em.userId) 
    AND (u.id = gr.userId) 
GROUP BY u.id 

或者來串聯值來獲得一個行(感謝@克里斯 - 摩根):

SELECT u.name, 
    GROUP_CONCAT(ph.phone SEPARATOR ','), 
    GROUP_CONCAT(em.email SEPARATOR ','), 
    GROUP_CONCAT(gr.groupName SEPARATOR ',') 
FROM users AS u, phones AS ph, emails AS em, groups AS gr 
WHERE (u.id = ph.userId) 
    AND (u.id = em.userId) 
    AND (u.id = gr.userId) 
GROUP BY u.id 
+0

這不回答這個問的問題。他希望每個姓名都有一行,並帶有連接的電話,電子郵件和組列表。 –

+0

羅傑,更新了答案! –

+0

謝謝你,除了Chris的筆記,你的查詢不使用contact_methods表。 – Chad