在多个表格联接中使用Group By进行Order by和Limit进行Limit by和Max

时间:2018-10-19 22:51:55

标签: mysql join group-by limit

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
  • 2972​​8 | 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)

1 个答案:

答案 0 :(得分:0)

  • Group_Concat()函数具有一个可选的true子句,我们可以使用该子句基于另一个/相同的列对要连接的列值进行排序。
  • 您可以使用Substring_Index()函数将串联字符串限制为每组5个。

尝试:

Order By

MySQL 8.0.2 and onwards中,我们可以在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 的分区中利用Window Functions来确定Row_Number()。我们可以按J.ID进行排序,以得到相应的行号。

现在,将此结果集用作Derived Table,并仅考虑行号5之前的行。然后可以相应地执行LJ.PopulationGroup By

Group_Concat()