SQL Query使用GROUP_CONCAT的意外结果

时间:2014-07-23 09:14:27

标签: php mysql sql

我遇到了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表中每个联系人的行以及他们工作的公司(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个其他表格

  • directorycolumn
  • directorysupplement
  • directoryprogramme

这个想法是它会返回联系人列表中的联系人也写过的所有列,补充和程序。另外要指出的是,在某些情况下,联系人可能已经写了超过1列,补充或程序,因此我理想地希望在与联系人相同的行中显示它,而不是复制行,所以我使用了{{ 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

所以我的问题是,其他2个结果在哪里消失了,为什么它们没有显示?还有为什么gcname中的信息是为这个联系人显示的,实际上它与id为1939的联系人有关

2 个答案:

答案 0 :(得分:1)

如果删除GROUP_CONCAT,它将显示正确的记录,因为当您使用此函数时,您应该有GROUP BY子句。目前,它将所有记录视为一个组。

如果你看gcname中的值是多个,这是正确的。

答案 1 :(得分:1)

Group_concat是mysql aggregate functions的一部分。这意味着它将所有相等的值组合成一行,在您的情况下,所有三列具有相同的值,这就是为什么您只得到一个结果。你期望使用group_concat会得到什么结果?