2014-07-23 43 views
0

我遇到sql查詢問題,我不確定我在做什麼錯誤。反正讓我解釋一下:使用GROUP_CONCAT的SQL查詢出現意外的結果

最初,這是原始查詢:

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 

聲明獲取所有的從contactlist表的詳細其中ID爲X.它返回的信息是爲每個聯繫人一行在聯繫人列表中,以及他們工作的公司(目錄公司)信息以及有關聯繫人表中聯繫人的各種其他詳細信息。因此,信息看起來是這樣的:

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 

我後來去,並試圖修改被要求上述SQL作爲附加功能,但我已經看到不想要的結果。基本上,我想JOIN 3其他表

  • directorycolumn
  • directorysupplement
  • directoryprogramme

的想法是,它會返回所有列,補充和方案,在接觸聯繫表也寫了。另外要指出的是,在某些情況下,一個聯繫人可能寫了多於一列,補充或程序,因此我理想地希望將其顯示在與聯繫人相同的行中,而不是複製行,所以我使用了GROUP_CONCAT()函數。

這是修改後的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 

這將返回:

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 

所以我的問題是,去哪裏其他2個結果走了,他們爲什麼不顯示?此外,爲什麼gcname中的信息顯示在這個聯繫人上,實際上它與聯繫人ID有關1939

+0

也許增加一個'GROUP BY'子句? – hjpotter92

+0

如果我用'GROUP BY'替換'ORDER BY',它只會返回一個結果。 – Javacadabra

+0

我會建議'GROUP BY contact_id'作爲喬,吉姆和傑伊共用同一個姓氏,你不想只爲他們一行,對不對? – TheConstructor

回答

1

如果你刪除了GROUP_CONCAT它將顯示正確的記錄,因爲當你使用這個功能時你應該有GROUP BY子句。目前它會將所有記錄視爲一個組。

如果你看gcname中的值是多個,這是正確的。

1

Group_concat是mysql aggregate functions的一部分。這意味着它會將所有相同的值組合成一行,在您的情況下,所有三列具有相同的值,這就是爲什麼您只能得到一個結果。你期望使用group_concat會有什麼結果?