2011-05-13 3 views
0

J'ai besoin d'aide sérieuse. Voici la chose ... Supposons que j'ai une table 'users' avec des champs (userId, name). Maintenant, je dois saisir plusieurs éléments d'information de l'autre table concernant cet utilisateur. Certains articles sont similaires et doivent donc être regroupés.multi-table SELECT de la base de données mysql (retourner plusieurs éléments dans un seul champ)

Maintenant, j'ai aussi plusieurs autres tables:

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; 

Comme vous pouvez le deviner, chaque utilisateur peut avoir plusieurs e-mails, téléphones et faire partie de plusieurs groupes. Comment afficher une table comme ci-dessous en utilisant tous les tableaux ci-dessus?

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

MISE À JOUR: Les e-mails et les téléphones ne doivent pas être prises immédiatement de leurs tables. La table contact_methods contient des entrées qui référencent ces tables.

Répondre

2

Essayez cette taille pour

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 

Ou pour concaténer les valeurs pour obtenir une ligne (merci @ chris-morgan):

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

Cela ne répond pas à la question posée. Il veut une ligne par nom, avec des listes de numéros de téléphone, d'e-mails et de groupes concaténés. –

+0

Roger, mise à jour de la réponse! –

+0

Merci pour cela mais, en plus de la note de Chris, votre requête n'utilise pas la table contact_methods. – Chad

Questions connexes