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!