Mysql 对按日期分组的所有条目“循环”相同的SQL查询
我有一张这样的桌子:Mysql 对按日期分组的所有条目“循环”相同的SQL查询,mysql,Mysql,我有一张这样的桌子: +------------+-----------+------+----+ | date | player_id | rank | hp | +------------+-----------+------+----+ | 2021-01-01 | 1 | 1 | 39 | | 2021-01-01 | 5 | 2 | 20 | | 2021-01-01 | 2 | 3 | 12 | | 202
+------------+-----------+------+----+
| date | player_id | rank | hp |
+------------+-----------+------+----+
| 2021-01-01 | 1 | 1 | 39 |
| 2021-01-01 | 5 | 2 | 20 |
| 2021-01-01 | 2 | 3 | 12 |
| 2021-01-01 | 3 | 4 | 48 |
| 2021-01-01 | 4 | 5 | 25 |
| 2021-01-02 | 1 | 2 | 42 |
| 2021-01-02 | 2 | 1 | 38 |
| 2021-01-02 | 3 | 4 | 21 |
| 2021-01-02 | 4 | 3 | 35 |
| 2021-01-02 | 5 | 5 | 28 |
| 2021-01-03 | 1 | 5 | 38 |
| 2021-01-03 | 3 | 2 | 31 |
| 2021-01-03 | 2 | 3 | 26 |
| 2021-01-03 | 4 | 4 | 22 |
| 2021-01-03 | 5 | 1 | 19 |
+------------+-----------+------+----+
+------------+-----------+------+----+
| date | player_id | rank | hp |
+------------+-----------+------+----+
| 2021-01-01 | 1 | 1 | 39 |
| 2021-01-01 | 5 | 2 | 20 |
| 2021-01-02 | 1 | 2 | 42 |
| 2021-01-02 | 2 | 1 | 38 |
| 2021-01-03 | 3 | 2 | 31 |
| 2021-01-03 | 2 | 3 | 26 |
+------------+-----------+------+----+
当我使用以下SQL代码时:
SELECT * FROM
(SELECT * FROM `players` WHERE date='2021-01-01' ORDER BY rank ASC LIMIT 3) highest_rank
ORDER BY hp DESC LIMIT 2
结果将是:
+------------+-----------+------+----+
| date | player_id | rank | hp |
+------------+-----------+------+----+
| 2021-01-01 | 1 | 1 | 39 |
| 2021-01-01 | 5 | 2 | 20 |
+------------+-----------+------+----+
我的问题是,结果只适用于日期=2021-01-01'。我想在数据库中每天都这样做。最终,我希望结果如下所示:
+------------+-----------+------+----+
| date | player_id | rank | hp |
+------------+-----------+------+----+
| 2021-01-01 | 1 | 1 | 39 |
| 2021-01-01 | 5 | 2 | 20 |
| 2021-01-01 | 2 | 3 | 12 |
| 2021-01-01 | 3 | 4 | 48 |
| 2021-01-01 | 4 | 5 | 25 |
| 2021-01-02 | 1 | 2 | 42 |
| 2021-01-02 | 2 | 1 | 38 |
| 2021-01-02 | 3 | 4 | 21 |
| 2021-01-02 | 4 | 3 | 35 |
| 2021-01-02 | 5 | 5 | 28 |
| 2021-01-03 | 1 | 5 | 38 |
| 2021-01-03 | 3 | 2 | 31 |
| 2021-01-03 | 2 | 3 | 26 |
| 2021-01-03 | 4 | 4 | 22 |
| 2021-01-03 | 5 | 1 | 19 |
+------------+-----------+------+----+
+------------+-----------+------+----+
| date | player_id | rank | hp |
+------------+-----------+------+----+
| 2021-01-01 | 1 | 1 | 39 |
| 2021-01-01 | 5 | 2 | 20 |
| 2021-01-02 | 1 | 2 | 42 |
| 2021-01-02 | 2 | 1 | 38 |
| 2021-01-03 | 3 | 2 | 31 |
| 2021-01-03 | 2 | 3 | 26 |
+------------+-----------+------+----+
如何做到这一点?如果有什么不同的话,我正在使用MySQL/MariaDB。问题解决了。值得称赞的是,评论部分中的sticky bit提供了一个几乎奏效的解决方案。他收回了这个建议,因为我认为这不是最终的解决办法。但我把它修好了,让它开始工作了。谢谢你,小粘蛋 对于任何对解决方案感兴趣的人:
SELECT date, player_id, rank, hp
FROM
(
SELECT *,
row_number() OVER (PARTITION BY date
ORDER BY hp DESC) h
FROM
(
SELECT *,
row_number() OVER (PARTITION BY date
ORDER BY rank ASC) r
FROM players
) x
WHERE r<=3
) y
WHERE h<=2
发布任务本身。如果有什么不同的话,我正在使用MySQL/MariaDB。什么是精确的服务器版本?如果一天内记录少于两条或没有记录,该怎么办?@Akina我使用MariaDB 10。我不知道你发布任务本身是什么意思?完成了。谢谢你指出这一点@Scratte!