簡體   English   中英

使用GROUP_CONCAT的SQL查詢產生意外結果

[英]Unexpected results from SQL Query using 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

該語句從id為X的contactlist表中獲取所有詳細信息。它返回的信息是contactlist表中每個聯系人的一行,以及有關他們工作的公司(directorycompany)的信息以及有關該聯系人的各種其他詳細信息從聯系表。 因此,信息如下所示:

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個表

  • 目錄欄
  • 目錄補充
  • 目錄程序

其想法是,它將返回聯系人列表中的聯系人也編寫的所有列,補充和程序。 另外要指出的是,在某些情況下,某個聯系人可能編寫了多於1列,補充或程序,因此,理想情況下,我希望將其顯示在與該聯系人相同的行中,而不是復制行,因此我使用了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的聯系人有關時顯示此聯系人的原因

如果刪除GROUP_CONCAT,它將顯示正確的記錄,因為使用此函數時,您應該具有GROUP BY子句。 當前,它將所有記錄視為一個組。

如果您在gcname中查找的值是多個,那是正確的。

Group_concat是mysql聚合函數的一部分。 這意味着它將所有相等的值組合到一行中,在您的情況下,所有三列都具有相同的值,這就是為什么只得到一個結果的原因。 您希望使用group_concat有什么結果?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM