【问题标题】:Order by and Limit in a multiple table join using Group By to do a Limit by and Max使用 Group By 执行 Limit by 和 Max 在多表连接中的 Order by 和 Limit
【发布时间】:2023-03-16 05:49:01
【问题描述】:
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 条记录。

在 TableLJ 中有一个字段 Population,我可以使用它来排序和限制,但没有多少摆弄可以让我指定我想从该表 PER 组中选择前 5 个。

更新是我可以执行以下操作来限制 group_concat (仍然不能解决让它们首先按 LJ.Population 排序)

substring_index(group_concat(ID SEPARATOR '|'),'|',5)

【问题讨论】:

  • 嗨。选择每组前 n 个是常见问题解答。 (显然。)(它有一个标签:[limit-per-group]。)请在考虑询问之前进行研究。见How to Ask
  • @philipxy显然是什么?我做了研究,并以我能弄清楚如何问的方式问它。你是说我应该知道它被称为 ilmit-per-group 还是有这样的东西?
  • 你的 MySQL 服务器版本是多少?
  • 你打算对结果做什么(如果有的话)?

标签: mysql join group-by limit


【解决方案1】:
  • Group_Concat() 函数有一个可选的 Order By 子句,使用它我们可以根据另一个/相同的列对列值进行排序。
  • 您可以使用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,在J.ID 的分区内确定Row_Number()。我们可以通过LJ.Population排序得到相应的行号。

现在,将此结果集用作 Derived Table 并仅考虑行号 5 之前的行。然后您可以相应地执行 Group ByGroup_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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 2014-03-17
    • 2017-05-12
    • 2014-01-09
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多