我有一个表,其中每个记录type
中需要最新的2行。使用GROUP BY
。
例如,从下面的图片中,我想要得到的最后2条记录取决于每种date
类型的page
列。我知道会使用GROUP BY
,但我对此不太熟悉。。谢谢
答案 0 :(得分:1)
长话短说,一旦您拥有很少的不同类型,就可以使用UNION方式:
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
...
只需对您拥有的每种“页面”类型重复此操作。
如果此解决方案不适合您,请看一下这篇文章:http://www.sqlines.com/mysql/how-to/get_top_n_each_group
欢呼声
Nikao
答案 1 :(得分:0)
您可以将关联子查询与limit
子句一起使用:
select t.*
from table t
where id in (select t1.id
from table t1
where t1.page = t.page
order by t1.date desc
limit 2
);
但是,仅GROUP BY
不能满足您的需要,您可能需要JOIN
。
答案 2 :(得分:0)
如果您的mysql版本是8+,则可以使用row_number窗口函数,但是如果低于8,则可以使用以下生成行号的方法
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;
答案 3 :(得分:0)
您不能仅使用GROUP BY来获得所需的结果。 您只能使用子查询和GROUP_CONCAT。看到这个: Using LIMIT within GROUP BY to get N results per group?
如果您的MySQL版本不支持这些功能,则需要使用其他方法:
SELECT DISTINCT page;
SELECT ... LIMIT 2;
您应该意识到,如果您的数据库很大,这两种方法的性能可能会大不相同。