【问题标题】:How to use GROUP_CONCAT on multiple JOIN如何在多个 JOIN 上使用 GROUP_CONCAT
【发布时间】:2020-03-01 06:03:41
【问题描述】:

我目前正在使用 cus_id 作为初始查询从多个表中检索数据。从这里我有多个表,可以有不同的数据行,我想检索并使用 GROUP_CONCAT 在单行中返回这些数据。目前,我的查询根据其中一个组连接返回的最大行数返回重复数据。

SELECT a.id,c.x,c.y,c.z

GROUP_CONCAT(a.column_a) AS aca, 
GROUP_CONCAT(a.column_b) AS acb, 
GROUP_CONCAT(b.column_a) AS bca, 
GROUP_CONCAT(b.column_b) AS bcb, 

FROM `table_a` a
INNER JOIN `table_b` b ON a.id = b.id
INNER JOIN `table_c` c ON a.id = c.id
WHERE a.id = ? 

另外,在这种情况下,正确的连接方法是什么。我希望我请求的所有字段都包含某种数据。

【问题讨论】:

  • 标题应该是 GROUP_CONCAT? - 编辑时删除。
  • 查看您的原始查询,我想知道您为什么要这样做。您似乎正在尝试解决一些您应该在 GUI 层(应用程序或网站)中更好地关心的显示问题。在 SQL 中执行此操作时,请注意您会丢失关系。示例:表 b 包含行 (1,10)、(2,20)、(3,30)。您的 GROUP_CONCAT 结果可能是 ('1,3,2', '30,20,10')。除非您指定,否则没有保证顺序:GROUP_CONCAT(col_a ORDER BY b_id).

标签: mysql sql-server-group-concat


【解决方案1】:

问题已通过使用子查询来隔离 GROUP_CONCAT 请求得到解决。这使我可以只获得我想要的数据,而不会被其他 JOIN 请求操纵的重复结果。

SELECT a.id,c.x,c.y,c.z 

(SELECT GROUP_CONCAT(column_a) FROM table_a) AS aca, 
(SELECT GROUP_CONCAT(column_b) FROM table_a) AS acb, 
(SELECT GROUP_CONCAT(column_a) FROM table_b) AS bca, 
(SELECT GROUP_CONCAT(column_b) FROM table_b) AS bcb,

FROM table_a a
INNER JOIN `table_c` c ON a.id = c.id
WHERE a.id = ? 

【讨论】:

    【解决方案2】:

    加入前聚合。大致如下:

    select
      a.*,
      b.grp_a,
      b.grp_b,
      c.grp_x,
      b.grp_y
    from table_a a
    join
    (
      select
        a_id,
        group_concat(a order by b_id) as grp_a,
        group_concat(b order by b_id) as grp_b
      from table_b
      group by a_id
    ) b on b.a_id = a.id
    join
    (
      select
        a_id,
        group_concat(x order by c_id) as grp_x,
        group_concat(y order by c_id) as grp_y
      from table_c
      group by a_id
    ) c on c.a_id = a.a_id
    order by a.a_id;
    

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2016-11-16
      • 2012-06-12
      • 1970-01-01
      • 2015-04-16
      • 2014-02-01
      相关资源
      最近更新 更多