简体   繁体   中英

Unexpected results from SQL Query using GROUP_CONCAT

I'm having an issue with an sql query and I'm not sure what I am doing wrong. Anyways let me explain:

Initially this was the original query:

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

The statement fetches all of the details from the contactlist table where the id is X. The information it returns is a row for each contact in the contactlist table along with information on the company (directorycompany) they work for and various other details about the contact from the contact table. So the information looks something like this:

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

I then went and attempted to modify the above SQL as additional functionality was required but I've been seeing unwanted results. Basically I am trying to JOIN 3 other tables

  • directorycolumn
  • directorysupplement
  • directoryprogramme

The idea being that it would return all of the columns, supplements and programmes that the contact in the contactlist has also written. Also to point out, in some cases a contact may have written more than 1 column, supplement or programme and as a result I ideally wanted to display this in the same row as the contact as opposed to duplicating the rows so I used the GROUP_CONCAT() function.

This is the modified 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

This returns:

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

So my question is, where have the other 2 results gone and why are they not showing? And also why is the information in gcname being displayed for this contact when in fact it is related to the contact with the id 1939

if you remove GROUP_CONCAT it would display correct records, because when you use this function you should have GROUP BY clause. Currently it will consider all records as a single group.

If you look values in gcname is multiple, which is correct.

Group_concat is part of mysql aggregate functions . That means it will group all equal values together into one row, in your case all three columns have the same value, thats why you only get one as result. what result would you expect using group_concat?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM