如果您的mysql版本为8+的话,您可以使用row\ u number窗口函数,但是如果是下面的话,您可以使用下面的方法生成行号
set @num := 0, @page:= '';
select x.*
from (
select t.*,
@num := if(@page= page, @num + 1, 1) as row_number,
@page:= page as d
from table t
order by date desc
) as x where x.row_number <= 2;
SELECT * FROM (SELECT * FROM table WHERE page = 'sometype' ORDER BY date limit 2) t
UNION ALL
SELECT * FROM (SELECT * FROM table WHERE page = 'someothertype' ORDER BY date limit 2) t
UNION ALL
SELECT * FROM (SELECT * FROM table WHERE page = 'otherothertype' ORDER BY date limit 2) t
...
4条答案
按热度按时间4dbbbstv1#
如果您的mysql版本为8+的话,您可以使用row\ u number窗口函数,但是如果是下面的话,您可以使用下面的方法生成行号
lsmepo6l2#
可以将相关子查询与
limit
条款:但是,只有
GROUP BY
不足以满足您的需要JOIN
.sgtfey8w3#
长话短说,一旦你有这么少不同的类型,你可以使用一个联合aproach:
只要对每一个“页面”类型重复这个。
如果此解决方案不适合您,请参阅本文:http://www.sqlines.com/mysql/how-to/get_top_n_each_group
干杯
尼考
wydwbb8l4#
你不能仅仅用分组来得到你想要的结果。您只能通过子查询和组连接来完成。看到这个了吗:使用groupby中的limit来得到每个组n个结果?
如果您的mysql版本不支持这些功能,您将需要一种不同的方法:
获取所有不同页面类型的列表:
SELECT DISTINCT page;
以编程方式迭代页面类型和SELECT ... LIMIT 2;
从主表您应该知道,如果您有一个巨大的数据库,这两种方法可能会有非常不同的性能。