2014-07-23 4 views
0

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

+0

Peut-être ajouter une clause 'GROUP BY'? – hjpotter92

+0

Si je remplace 'ORDER BY' par' GROUP BY', il ne renvoie qu'un seul résultat. – Javacadabra

+0

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

Répondre

1

si vous supprimez GROUP_CONCAT il affichera les enregistrements corrects, parce que lorsque vous utilisez cette fonction, vous devriez avoir GROUP Clause BY. Actuellement, il considérera tous les enregistrements comme un seul groupe.

Si vous estimez que les valeurs dans gcname sont multiples, ce qui est correct.

1

Group_concat fait partie de mysql aggregate functions. Cela signifie qu'il va regrouper toutes les valeurs égales en une seule ligne, dans votre cas, les trois colonnes ont la même valeur, c'est pourquoi vous n'en avez qu'un comme résultat. quel résultat attendriez-vous en utilisant group_concat?

Questions connexes