有没有一种方法可以限制MySQL中每组结果行的结果?

编程入门 行业动态 更新时间:2024-10-23 09:40:22
本文介绍了有没有一种方法可以限制MySQL中每组结果行的结果?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有以下查询:

SELECT title, karma, DATE(date_uploaded) as d FROM image ORDER BY d DESC, karma DESC

这将给我一张图像记录列表,首先按最新日期排序,然后按大多数业障排序.

This will give me a list of image records, first sorted by newest day, and then by most karma.

缺少一件事:我只希望每天获得业力最高的x张图像.因此,举例来说,每天我只想要10个最大的业力图像.我当然可以每天运行多个查询,然后合并结果.

There is just one thing missing: I want to only get the x images with the highest karma per day. So for example, per day I only want the 10 most karma images. I could of course run multiple queries, one per day, and then combine the results.

我想知道是否有一种更聪明的方法仍然可以很好地执行.我想我正在寻找的是每组结果使用LIMIT x,y的方法吗?

I was wondering if there is a smarter way that still performs well. I guess what I am looking for is a way to use LIMIT x,y per group of results?

推荐答案

您可以通过使用变量模拟ROW_NUMBER来实现.

You can do it by emulating ROW_NUMBER using variables.

SELECT d, title, karma FROM ( SELECT title, karma, DATE(date_uploaded) AS d, @rn := CASE WHEN @prev = UNIX_TIMESTAMP(DATE(date_uploaded)) THEN @rn + 1 ELSE 1 END AS rn, @prev := UNIX_TIMESTAMP(DATE(date_uploaded)) FROM image, (SELECT @prev := 0, @rn := 0) AS vars ORDER BY date_uploaded, karma DESC ) T1 WHERE rn <= 3 ORDER BY d, karma DESC

结果:

'2010-04-26', 'Title9', 9 '2010-04-27', 'Title5', 8 '2010-04-27', 'Title6', 7 '2010-04-27', 'Title7', 6 '2010-04-28', 'Title4', 4 '2010-04-28', 'Title3', 3 '2010-04-28', 'Title2', 2

Quassnoi 上有一篇很好的文章,详细介绍了该技术:在MySQL中模拟ROW_NUMBER()-行采样.

Quassnoi has a good article about this which explains the technique in more details: Emulating ROW_NUMBER() in MySQL - Row sampling.

测试数据:

CREATE TABLE image (title NVARCHAR(100) NOT NULL, karma INT NOT NULL, date_uploaded DATE NOT NULL); INSERT INTO image (title, karma, date_uploaded) VALUES ('Title1', 1, '2010-04-28'), ('Title2', 2, '2010-04-28'), ('Title3', 3, '2010-04-28'), ('Title4', 4, '2010-04-28'), ('Title5', 8, '2010-04-27'), ('Title6', 7, '2010-04-27'), ('Title7', 6, '2010-04-27'), ('Title8', 5, '2010-04-27'), ('Title9', 9, '2010-04-26');

更多推荐

有没有一种方法可以限制MySQL中每组结果行的结果?

本文发布于:2023-10-26 23:27:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1531655.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:每组   方法   MySQL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!