Je rencontre un problème avec une requête sql
et je ne suis pas sûr de ce que je fais mal. Quoi qu'il en soit moi vous expliquer:Résultats inattendus de requête SQL utilisant GROUP_CONCAT
Au départ, ce fut la requête originale:
SELECT cl.*,
c.id,c.type,
c.firstname,
c.surname,
c.job,
c.company,
c.directorycompany_id,
dc.id, dc.name,
es.id FROM contactlist_contact cl
INNER JOIN contact c ON cl.contact_id = c.id
LEFT JOIN directorycompany dc ON dc.id = c.directorycompany_id
LEFT JOIN expertsection es ON es.id = c.expertsection_id
WHERE cl.contactlist_id = 36311
ORDER BY dc.surname
La déclaration va chercher tous les détails de la table contactlist où l'identification est X. L'information retourne une ligne pour chaque contact dans le tableau de la liste de contacts avec des informations sur l'entreprise (annuaire) pour lesquelles ils travaillent et d'autres détails sur le contact de la table de contacts. Donc, l'information ressemble à ceci:
contactlist_id contact_id id active id type firstname surname job company directorycompany_id id name id
36311 1939 316955375 1 1939 directory Joe Bloggs Deputy Editor 786 786 Herald People 0
36311 1935 316955374 1 1935 directory Jim Bloggs Advertising Manager 786 786 Herald People 0
36311 28034 316955373 1 28034 directory Jay Bloggs News Reporter 786 786 Herald People 0
Je suis ensuite allé et a tenté de modifier la SQL
ci-dessus comme une fonctionnalité supplémentaire était nécessaire, mais je l'ai été voir des résultats indésirables. En fait, je suis en train de JOIN
3 autres tables
- directorycolumn
- directorysupplement
- directoryprogramme
L'idée étant qu'il retournerait toutes les colonnes, les suppléments et les programmes que le contact dans la liste de contacts a également écrit. De plus, dans certains cas, un contact peut avoir écrit plus d'une colonne, compléter ou programmer et, par conséquent, j'ai idéalement voulu afficher ceci dans la même rangée que le contact plutôt que de dupliquer les lignes, donc j'ai utilisé la fonction GROUP_CONCAT()
.
C'est modifié SQL
SELECT cl.*,
c.id,
c.type,
c.firstname,
c.surname,
c.job,
c.company,
c.directorycompany_id,
dc.id, dc.name,
es.id,
GROUP_CONCAT(dirc.name) AS gcname,
GROUP_CONCAT(dirp.name) AS gpname,
GROUP_CONCAT(dirs.name) AS gsname
FROM contactlist_contact cl
INNER JOIN contact c ON cl.contact_id = c.id
LEFT JOIN directorycompany dc ON dc.id = c.directorycompany_id
LEFT JOIN expertsection es ON es.id = c.expertsection_id
LEFT JOIN directorycolumn dirc ON dirc.directorycontact_id = c.id
LEFT JOIN directoryprogramme dirp ON dirp.directorycontact_id = c.id
LEFT JOIN directorysupplement dirs ON dirs.directorycontact_id = c.id
WHERE cl.contactlist_id = 36311
ORDER BY dc.surname
Ce retour:
contactlist_id contact_id id active id type firstname surname job company directorycompany_id id name id gcname gpname gsname
36311 28034 316955373 1 28034 directory Jay Bloggs News Reporter 786 786 Herald People 0 The Arts Scene,Farming \N \N
Donc ma question est, où les autres ont 2 résultats disparu et pourquoi sont-ils pas montrer? Et aussi pourquoi les informations dans gcname sont affichées pour ce contact alors qu'en fait il est lié au contact avec l'id 1939
Peut-être ajouter une clause 'GROUP BY'? – hjpotter92
Si je remplace 'ORDER BY' par' GROUP BY', il ne renvoie qu'un seul résultat. – Javacadabra
Je suggérerais 'GROUP BY contact_id' car Joe, Jim et Jay partagent le même nom de famille et vous ne voulez pas avoir une seule ligne pour tous, n'est-ce pas? – TheConstructor