繁体   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