在单独的行记录

时间:2016-04-18 15:43:21

标签: mysql group-concat

我在使用GROUP_CONCAT时遇到了麻烦。我很确定这是获得我想要的唯一方法,但它似乎没有给我我需要的结果。

以下是我的发言:

SELECT
   b.*,
   GROUP_CONCAT(c.finance_code) AS finance_codes
FROM
   `oc_finance_breakpoints` b
   LEFT JOIN
      `oc_finance_breakpoints_codes` c ON c.breakpoint_id = b.breakpoint_id;

这将收集finance_breakpoints表中的数据,结构如下:

  

breakpoint_id
  from_value
  to_value
  minimum_deposit

以及多个"财务代码"来自我的联接表,finance_breakpoint_codes:

  

breakpoint_code_id
  breakpoint_id
  finance_code

断点可能存在多个财务代码。当我只有一个条目运行sql时,我得到以下内容:

  

1 | 280.00 | 750.00 | 10 | ONIF6,ONIF10,ONIF12

但是如果断点表中有两个条目,那么所有发生的事情就是将额外的财务代码添加到上面的末尾,这意味着我只得到一行包含第一组数据和所有财务代码在一栏中。

理想情况下,我希望能够返回如下内容:

  

1 | 280.00 | 750.00 | 10 | ONIF6,ONIF10,ONIF12

     

2 | 750.00 | 1500.00 | 10 | ONIB12-9.9,ONIB24-9.9,ONIB36-9

而不是:

  

1 | 280.00 | 750.00 | 10 | ONIF6,ONIF10,ONIF12,ONIB12-9.9,ONIB24-9.9,ONIB36-9

有没有办法达到我想要的?我可能使用了错误的功能吗?

1 个答案:

答案 0 :(得分:1)

在查询中使用聚合函数(例如GROUP_CONCAT)可确保它返回聚合结果,而缺少显式分组可确保它返回单个整体摘要行。

您需要在查询末尾添加group by子句 - 如下所示:

SELECT
   b.*,
   GROUP_CONCAT(c.finance_code) AS finance_codes
FROM
   `oc_finance_breakpoints` b
   LEFT JOIN `oc_finance_breakpoints_codes` c 
          ON c.breakpoint_id = b.breakpoint_id
GROUP BY b.breakpoint_id