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

在多表联接中使用Group by执行Limit by和Max的Order by和Limit

  •  -1
  • user3649739  · 技术社区  · 6 年前
    Select group_concat(ID SEPARATOR '|') 
      from TableJ J
      Left Join TableL L on L.J_ID=J.ID
      Left Join TableB B on B.LJ_ID=L.F_ID
      Left Join TableLJ LJ on LJ.ID=L.F_ID
    Group 
        by J.ID
    

    • 103237 | 43775 | 84462 | 19153 | 54618 | 108646 | 50142 | 96946 | 37251 | 75984 | 54524
    • 29728 | 46758 | 65987 | 20772 | 34513 | 61323 | 2778 | 32630 | 53616 | 103450 | 27152 | 37278 | 65950 | 13837 | 33500 | 59490

    问题是我需要将结果中的记录/管道限制为5个记录。

    Population 我可以使用它来排序和限制,但是没有任何修改允许我指定我要从每个组的表中选择前5个。

    更新是,我可以执行以下操作来限制组concat(仍然无法解决按LJ.Population首先排序的问题)

    substring_index(group_concat(ID SEPARATOR '|'),'|',5)
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Madhur Bhaiya    6 年前
    • Group_Concat() 函数有一个可选的 Order By 子句,使用它,我们可以根据另一列/同一列对列值进行排序以进行concat。
    • Substring_Index() 函数将连接的字符串限制为每组5个。

    尝试:

    SELECT Substring_Index(Group_concat(ID 
                                        ORDER BY LJ.Population ASC 
                                        SEPARATOR '|'), 
                           '|', 
                           5) 
    FROM   TableJ AS J
           LEFT JOIN TableL AS L
                  ON L.J_ID = J.ID
           LEFT JOIN TableB AS B
                  ON B.LJ_ID = L.F_ID
           LEFT JOIN TableLJ AS LJ
                  ON LJ.ID = L.F_ID
    GROUP  BY J.ID 
    

    MySQL 8.0.2 and onwards Window Functions ,以确定 Row_Number() J.ID . 我们可以分类 LJ.Population 以获得相应的行号。

    现在,将此结果集用作 Derived Table Group By Concat()组 因此。

    SELECT   Group_Concat(dt.ID ORDER BY dt.rownumber ASC SEPARATOR '|')
    FROM     (
              SELECT    J.ID,
                        ROW_NUMBER() OVER (PARTITION BY J.ID
                                           ORDER BY LJ.Population ASC) AS rownumber
              FROM      TableJ   AS J
              LEFT JOIN TableL   AS L
                ON  L.J_ID = J.ID
              LEFT JOIN TableB   AS B
                ON  B.LJ_ID = L.F_ID
              LEFT JOIN TableLJ  AS LJ
                ON  LJ.ID = L.F_ID ) AS dt
    WHERE    dt.rownumber <= 5
    GROUP BY dt.ID