2010-12-14 8 views
1

Je suis désolé pour le titre ambigu - je ne pouvais pas trouver une explication pour le comportement que je veux sans donner d'exemples. De plus, s'il s'agit d'un sujet dupliqué, veuillez m'en indiquer le bon et je vais le supprimer. Je ne pouvais pas chercher ce que je voulais parce que, comme je l'ai dit plus haut, c'est difficile à expliquer ...MySQL JOIN deux tables

Quoi qu'il en soit, je veux sélectionner les données de deux tables. L'un contient un tas de projets, tandis qu'un autre contient plusieurs éléments de liste de contrôle pour chaque projet. J'ai une LEFT JOIN très primitive requête en ce moment, qui renvoie cette (il n'y a qu'un seul projet, pour le moment):

 
name     description 
Project file symlinks One 
Project file symlinks Two 
Project file symlinks seven 
Project file symlinks ahahahahaha 
Project file symlinks many 
Project file symlinks ANOTHER ONE 

Ce que je comme arriver est ce, pour chaque projet dans le table de projets:

 
name     description 
Project file symlinks One 
         Two 
         seven 
         ahahahahaha 
         many 
         ANOTHER ONE 

Ou nul, cela n'a pas d'importance. Essentiellement, je veux seulement imprimer le nom du projet une fois, mais imprimer tous ses éléments de liste de contrôle correspondants.

Voici la requête que j'ai actuellement:

 
SELECT Projects.name, DevProgress.description 
FROM DevProgress 
LEFT JOIN Projects 
ON Projects.id = DevProgress.projectID 

Quelqu'un peut-il proposer une requête MySQL JOIN pour que je puisse obtenir le comportement que je veux? Merci pour toute aide,

EDIT

Merci beaucoup à Dcp pour me aider. Je suis finalement venu avec cette requête LEFT JOIN, apparaissant comme référence:

 
SELECT name, GROUP_CONCAT(description) AS checklist 
FROM Projects LEFT JOIN DevProgress ON Projects.id = DevProgress.projectID 
GROUP BY name; 

Et la sortie:

 
name      checklist 
Project file symlinks  One,Two,seven,ahahahahaha,many,ANOTHER ONE 
Testing Project numer 1 NULL 

James

+0

pouvez-vous poster votre requête actuelle? – DeaconDesperado

Répondre

2

Vous pouvez utiliser group_concat pour obtenir toutes les descriptions ensemble pour chaque projet:

SELECT name,GROUP_CONCAT(description) FROM project GROUP BY name; 

Donc, cela va imprimer le d nom du projet istinct, avec toutes les descriptions de ce projet sur une seule ligne, et chaque description sera délimitée par des virgules.

Exemples:

create table project (name varchar(100), description varchar(100)); 

insert into project values ('Project file symlinks', 'One'); 
insert into project values ('Project file symlinks', 'Two'); 
insert into project values ('Project file symlinks', 'seven'); 
insert into project values ('Project file symlinks', 'ahahahahaha'); 
insert into project values ('Project file symlinks', 'many'); 
insert into project values ('Project file symlinks', 'ANOTHER ONE'); 

SELECT name,GROUP_CONCAT(description) FROM project GROUP BY name;  

Résultats:

name      GROUP_CONCAT(description) 
'Project file symlinks' 'One,Two,seven,ahahahahaha,many,ANOTHER ONE' 
+0

Merci. Pourriez-vous poster un exemple de sortie? – Bojangles

+0

@JamWaffes - J'ai posté un exemple de script avec la sortie. – dcp

+0

Merci! Je peux obtenir PHP pour faire le fractionnement de la chaîne. Je cherchais principalement un moyen de faire une requête au lieu de like, 20, pour chaque chargement de page. – Bojangles

0

Je ne sais pas beaucoup sur mySQL, mais il est faisable dans SQL Server, il pourrait être possible mySQL aussi. Mais ce que je veux dire, c'est que même si cela peut être faisable, ce serait plutôt moche, parce que SQL n'est pas conçu de cette façon. En SQL, chaque enregistrement du jeu de résultats est indépendant des autres. Ceci a plusieurs avantages - par exemple vous pouvez appliquer un filtre supplémentaire au jeu de résultats (si vous décidez que vous voulez seulement des descriptions commençant par "ahahaha"), vous pouvez le réorganiser (si vous voulez trier par description), vous pouvez paralléliser la requête et ainsi de suite sans perdre d'informations.C'est pourquoi certaines choses dans SQL sont juste un peu plus dures que dans d'autres langues, par exemple numéroter votre sortie, interroger des hiérarchies, transposer la sortie ou donner un traitement spécial au premier d'un groupe d'éléments. Donc, vos meilleures options pourraient être soit de vivre avec la sortie et de la post-traiter comme vous voulez (ce qui devrait être assez trivial - garder une variable avec le nom du dernier projet et remplacer le nom par une chaîne vide si son le même que celui-ci) ou utiliser la réponse de dcp et aplatir le groupe à une seule ligne de résultats.