【问题标题】:Group_concat is not displaying all values when use where clause使用 where 子句时 Group_concat 不显示所有值
【发布时间】:2018-11-30 09:05:31
【问题描述】:

我正在使用具有多个连接和 group_concat 的复杂查询,这是查询:

 select a.packagename as packagename, a.packageid as packageid, 
 sum(a.packageduration) as days, (a.packageprice + a.seater_4) as price,
 b.statename,
 substring_index(GROUP_CONCAT( DISTINCT (select f.placename )  SEPARATOR ', 
 '),',',4) placename,
 substring_index(GROUP_CONCAT( DISTINCT (select d.packagetypename )  
 SEPARATOR ', '),',',4) packagetypename
 from tblpackages a
 join tblstates b on b.stateid = a.stateid              
 join tblpackage_packagetypes c on c.packageid = a.packageid
 join tblpackagetype d on d.packagetypeid = c.packagetypeid
 join tblpackageplaces e on e.packageid = a.packageid
 join tblplaces f on f.placeid = e.placeid
                where d.placename = "placename"
                 group by a.packageid

我的 packagetypename 的 group_concat 根据查询显示 4 个值,但 placename 仅显示 where 子句中给出的 1 个值?

因为查询是按包 id 分组的,对于任何包,我有 N 个地方.... 查询按逻辑工作正常,但我想显示我对应的包 id 的所有包

【问题讨论】:

  • 一些示例数据和输出在这里真的有很长的路要走。
  • 输出信息已共享....您认为需要更多信息吗?
  • 我仍然觉得在没有数据的情况下很难理解您的问题。我相信我建议的答案部分正确;但我不能说更多。
  • 是的,你的答案部分正确……但不是正确答案
  • 那么有机会看到您的数据,还是您更愿意让我们猜测?

标签: mysql sql group-concat string-aggregation


【解决方案1】:

输出你的查询,位修改为

select a.packagename as packagename, a.packageid as packageid, 
a.packageduration as days, (a.packageprice + a.seater_4) as price,
b.statename,
substring_index(GROUP_CONCAT( DISTINCT (select f.placename )  SEPARATOR ', '),',',4) 
placename,
substring_index(GROUP_CONCAT( DISTINCT (select d.packagetypename )  SEPARATOR ', 
'),',',4) packagetypename
from tblpackages a
inner join tblstates b on b.stateid = a.stateid              
inner join tblpackage_packagetypes c on c.packageid = a.packageid
inner  join tblpackagetype d on d.packagetypeid = c.packagetypeid
inner join tblpackageplaces e on e.packageid = a.packageid
left join tblplaces f on f.placeid = e.placeid  and d.packagetypename = 'religious'
                 group by a.packageid

pname、pid、days、price、statename、placename、packagetypename


test1, 1, 3, 111, xyz, (katra, shiv khori), 宗教
test2, 2, 3, 444, xyz, (Katra), 宗教

test3, 3, 3, 445, xyz, NULL, (家庭, 情侣, 冒险, 朋友)

test4, 4, 555, xyz, (Katra, Patnitop, sanasar, nathatop), (religious, family, Couple, Adventure)

test6 , 666, abc, NULL, (家庭、冒险、朋友)

包 id 3 和 6 不是必需的

【讨论】:

    【解决方案2】:

    我建议将WHERE 子句中的条件移至ON 子句中的相应连接,并将该连接设为左连接:

    SELECT ...
    FROM tblpackages a
    INNER JOIN tblstates b
        ON b.stateid = a.stateid              
    INNER JOIN tblpackage_packagetypes c
        ON c.packageid = a.packageid
    LEFT JOIN tblpackagetype d
        ON d.packagetypeid = c.packagetypeid AND d.placename = 'placename'
    INNER JOIN tblpackageplaces e
        ON e.packageid = a.packageid
    INNER JOIN tblplaces f
        ON f.placeid = e.placeid
    GROUP BY
        a.packageid
    

    【讨论】:

    • 嗨,您的查询正在处理额外的行。我总共有 6 个 ID 为 1,....,6 的包,根据我的查询,输出 ID 为 1,2,4,有一个地名,根据您的查询,我得到了正确的地名和正确的包类型名称,用于 id 的 1,2&4 但是我得到了 id 的 3,5 和 6 的额外行,地名库为 NULL
    猜你喜欢
    • 2011-05-16
    • 2022-01-08
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多