5 votes

MySQL Left Join Many to One Row

Pour simplifier mon problème : disons que j'ai 3 tables.

Rooms              People                    Things
--------           --------                  --------
id| name           id | name | fk_rooms      id | name | fk_rooms
-----------        ---------------------     ---------------------
1 | kitchen        1  | John | 1              1 | TV   | 2
2 | bedroom        2  | Mary | 2              2 | bed  | 2
                   3  | Andy | 1              3 | sink | 1
                   4  | Laura| 1

Maintenant, je fais quelque chose comme :

SELECT r.name AS room_name, p.name AS name, t.name AS thing FROM Rooms r 
LEFT JOIN People p ON p.fk_rooms = r.id
LEFT JOIN Things t ON t.fk_rooms = r.id

ce qui, dans mon cas, fonctionne parfaitement, à l'exception de quelques-unes qui ont une relation multiple avec la table "Chambres". Ainsi, au lieu d'avoir de nouvelles lignes dans le jeu de résultats contenant les différents noms de "Personnes" et "Objets" en relation avec la table "Pièces", je voudrais recevoir seulement deux lignes :

1. kitchen, John, Andy, Laura, sink
2. bedroom, Mary, TV, bed

A GROUP BY sur r.id ne sera que select une ligne de chaque tableau. Toute aide est la bienvenue !

7voto

medina Points 3052

Voici ce que vous cherchez :

SELECT r.name AS room_name, 
   GROUP_CONCAT(p.name separator ',') AS people_name, 
   GROUP_CONCAT(t.name separator ',') AS things
FROM Rooms r 
LEFT JOIN People p ON p.fk_rooms = r.id
LEFT JOIN Things t ON t.fk_rooms = r.id
GROUP BY r.id

1voto

Lajos Arpad Points 5986

Oui, vous avez besoin de la clause group by, et vous devez utiliser la fonction GROUPE_CONCAT fonction. Vous devez regrouper vos résultats par People.fk_rooms et Thing.fk_rooms.

Vous pourriez peut-être utiliser deux requêtes différentes : La première résultera de la jointure de Rooms et People, groupée par fk_rooms, ayant sélectionné trois colonnes, à savoir RoomsID, RoomName, People, tandis que la seconde résultera de la jointure de Rooms et Thing, groupée par fk_rooms, ayant sélectionné trois colonnes, à savoir RoomID, RoomName, Things. Dans votre requête, vous nommez ces sélections t1 et t2 et vous joignez t1 et t2 par RoomsID, sélectionnez t1.RoomName, t1.People, t2.Things.

Bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X