代码之家  ›  专栏  ›  技术社区  ›  Dipak

组内的CONCAT \u CONCAT-如何删除重复结果

  •  1
  • Dipak  · 技术社区  · 7 年前

    CONCAT GROUP_CONCAT ,下面的mysql代码有什么问题?请看SQL Fiddle,完整的代码在那里。

    让我解释一下,我有5张桌子

    -课程列表

    -章节列表

    费用 -费用清单

    -分配给每个类的节的列表

    cls\U费用 -分配给每个部门的费用清单

    cls

    id  |   ttl
    ===========
    1   |   One
    2   |   Two
    3   |   Three
    

    sec

    id  |   ttl
    ===========
    1   |   A
    2   |   B
    

    cls_sec -分配给班级的每个部分的列表

    id  |   c_id|   s_id    
    =====================
    1   |   1   |   1
    2   |   1   |   2
    3   |   2   |   1
    

    fee -费用类别列表

    id  |   ttl
    ===========
    1   |   Annual
    2   |   Monthly
    3   |   Library
    

    cls_fee -分配给班级的每项费用和金额的清单

    id  |   c_id|   s_id|   f_id|   fee 
    =====================================
    1   |   1   |   1   |   1   |    2000
    2   |   1   |   1   |   2   |    500
    3   |   1   |   2   |   1   |    3000
    4   |   1   |   2   |   2   |    400
    5   |   2   |   1   |   1   |    4500
    6   |   2   |   1   |   2   |    450
    7   |   3   |   0   |   1   |    5000
    8   |   3   |   0   |   2   |    600
    9   |   3   |   0   |   3   |    300
    

    组\u CONCAT 结果

    我的当前输出(类名和节名根据费用重复获取)

    //Class Name - Section Name (if exist) - fee, Class Name - Section Name (if exist) - fee ..
    
    3.Three.Library->300, 3.Three.Monthly->600, 3.Three.Annual->5000, 
    2.Two-A.Monthly->450, 2.Two-A.Annual->4500, 1.One-A.Monthly->500, 
    1.One-A.Annual->2000, 1.One-B.Monthly->400, 1.One-B.Annual->3000
    

    具有以下代码

      GROUP_CONCAT(DISTINCT CONCAT('\r\n',cls.id,'.',cls.ttl,
           COALESCE(CONCAT('-',sec.ttl),''),COALESCE(CONCAT('.',fee.ttl,'->',cls_fee.fee))) 
           ORDER BY sec.id) AS cls  
    

    但我想要的是(删除重复类和节)

    //Class Name - Section Name (if exists) - fee, fee
    
    3.Three.Library->300,Monthly->600,Annual->5000, 
    2.Two-A.Monthly->450,Annual->4500, 
    1.One-A.Monthly->500,Annual->2000,
    1.One-B.Monthly->400,Annual->3000
    

    所以我补充说 康卡特 嵌套内 康卡特

      GROUP_CONCAT(DISTINCT CONCAT('\r\n',cls.id,'.',cls.ttl,
          COALESCE(CONCAT('-',sec.ttl,COALESCE(CONCAT('.',fee.ttl,'->',cls_fee.fee))), '')) 
          ORDER BY sec.id) AS cls
    

    并且得到了输出,但是它没有得到预期的效果,还缺少一些费用

    3.Three,
    2.Two-A.Monthly->450, 2.Two-A.Annual->4500, 
    1.One-A.Monthly->500, 1.One-A.Annual->2000, 
    1.One-B.Monthly->400, 1.One-B.Annual->3000
    

    MySQL代码

    SELECT
      GROUP_CONCAT(DISTINCT CONCAT('\r\n',cls.id,'.',cls.ttl,
          COALESCE(CONCAT('-',sec.ttl),''),COALESCE(CONCAT('.',fee.ttl,'->',cls_fee.fee))) 
          ORDER BY sec.id) AS cls
    FROM
      cls
    LEFT JOIN
      cls_sec ON cls_sec.cls = cls.id
    LEFT JOIN
      sec ON sec.id = cls_sec.sec
    LEFT JOIN
      cls_fee ON cls_fee.c_id = cls.id
    LEFT JOIN
      fee ON fee.id = cls_fee.f_id
    WHERE
      CASE WHEN cls_fee.s_id != 0 THEN cls_fee.s_id = sec.id ELSE cls.id END
    

    SQL Fiddle

    1 回复  |  直到 7 年前
        1
  •  1
  •   D-Shih    7 年前

    您可以尝试使用子查询来编写 GROUP_CONCAT cls.id, cls.ttl 那就做吧 再次在主查询中。

    查询1

    SELECT GROUP_CONCAT(CONCAT(Id,'.',ttl,'.',flag,cls)  ORDER BY Id desc,flag) result
    FROM (
      SELECT
         cls.id,
         cls.ttl,
         COALESCE(CONCAT('-',sec.ttl),'') flag,
         GROUP_CONCAT(DISTINCT CONCAT(
                    COALESCE(CONCAT('.',fee.ttl,'->',cls_fee.fee))) 
                    ORDER BY sec.id) AS cls
      FROM
        cls
      LEFT JOIN
        cls_sec ON cls_sec.cls = cls.id
      LEFT JOIN
        sec ON sec.id = cls_sec.sec
      LEFT JOIN
        cls_fee ON cls_fee.c_id = cls.id
      LEFT JOIN
        fee ON fee.id = cls_fee.f_id
      WHERE
        CASE WHEN cls_fee.s_id != 0 THEN cls_fee.s_id = sec.id ELSE cls.id END
      GROUP BY 
         cls.id,
         cls.ttl,
         COALESCE(CONCAT('-',sec.ttl),'')
    )t1
    

    Results :

    |                                                                                                                                                        result |
    |---------------------------------------------------------------------------------------------------------------------------------------------------------------|
    | 3.Three..Library->300,.Monthly->600,.Annual->5000,2.Two.-A.Monthly->450,.Annual->4500,1.One.-A.Monthly->500,.Annual->2000,1.One.-B.Monthly->400,.Annual->3000 |