sql-group-by子句

gcmastyq  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(362)

我有一个表,每个表需要最新的两行 type 记录的数量。使用 GROUP BY .
例如,从下面的图片中,我想要的是根据 date 每列 page 类型。我知道 GROUP BY 但我不太熟悉。。谢谢

4dbbbstv

4dbbbstv1#

如果您的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;
lsmepo6l

lsmepo6l2#

可以将相关子查询与 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 .

sgtfey8w

sgtfey8w3#

长话短说,一旦你有这么少不同的类型,你可以使用一个联合aproach:

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
干杯
尼考

wydwbb8l

wydwbb8l4#

你不能仅仅用分组来得到你想要的结果。您只能通过子查询和组连接来完成。看到这个了吗:使用groupby中的limit来得到每个组n个结果?
如果您的mysql版本不支持这些功能,您将需要一种不同的方法:
获取所有不同页面类型的列表: SELECT DISTINCT page; 以编程方式迭代页面类型和 SELECT ... LIMIT 2; 从主表
您应该知道,如果您有一个巨大的数据库,这两种方法可能会有非常不同的性能。

相关问题