gpt4 book ai didi

mysql - 前 x 行和分组依据(再次)

转载 作者:可可西里 更新时间:2023-11-01 08:22:43 24 4
gpt4 key购买 nike

我知道这是一个常见问题,但我就是想不通,而且我找到的示例也没有帮助。据我了解,最好的策略是尝试找到最高范围的最高值和最低值,然后选择其余值,但实现起来有点棘手。

示例表:

id | title | group_id | votes

我想为每个组从表中获得投票数最高的 3 行。

我期待这样的结果:

91 | hello1 | 1 | 10 
28 | hello2 | 1 | 9
73 | hello3 | 1 | 8
84 | hello4 | 2 | 456
58 | hello5 | 2 | 11
56 | hello6 | 2 | 0
17 | hello7 | 3 | 50
78 | hello8 | 3 | 9
99 | hello9 | 3 | 1

我喜欢复杂的查询和示例,但它们并没有真正帮助。

最佳答案

你可以使用变量来做到这一点:

SELECT
id,
title,
group_id,
votes
FROM (
SELECT
id,
title,
group_id,
votes,
@rn := CASE WHEN @prev = group_id THEN @rn + 1 ELSE 1 END AS rn,
@prev := group_id
FROM table1, (SELECT @prev := -1, @rn := 0) AS vars
ORDER BY group_id DESC, votes DESC
) T1
WHERE rn <= 3
ORDER BY group_id, votes DESC

这基本上与支持 ROW_NUMBER 的数据库中的以下查询相同:

SELECT
id,
title,
group_id,
votes
FROM (
SELECT
id,
title,
group_id,
votes,
ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY votes DESC) AS rn
FROM student
) T1
WHERE rn <= 3
ORDER BY group_id, votes DESC

但是因为 MySQL 不支持 ROW_NUMBER,所以你必须模拟它,这就是变量的作用。这两个查询在其他方面是相同的。首先尝试理解第二个查询,希望第一个能更有意义。

关于mysql - 前 x 行和分组依据(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2776300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com