【问题标题】:SQL query: Last but one rank for userSQL 查询:用户排名倒数第一
【发布时间】:2010-05-05 08:50:03
【问题描述】:

我的表结构如下:

create table rankings (
    id IDENTITY NOT NULL,
    user_id INT NOT NULL,
    game_poule_id INT NOT NULL,
    rank INT NOT NULL,
    insertDate DATETIME NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (game_poule_id) REFERENCES game_poules(id) ON DELETE CASCADE
    );

每个游戏的所有旧用户排名都保存在此表中。现在,我想在 gamepoule 中的所有用户的表中排名倒数第一。

有人知道如何实现这一目标吗?谢谢

【问题讨论】:

  • 请贴出你目前写的代码。人们通常不喜欢只为您编写代码。
  • 我现在有一个 GROUP BY 子句 SELECT user_id, rank FROM rankings WHERE FK_gamePoule = ? GROUP BY user_id 但是下一步比较困难:-)

标签: sql hsqldb


【解决方案1】:

您需要自行加入表以获取所需的记录。 对于这个答案,我创建了没有外键的表,因为它们不需要让它工作。

CREATE TABLE Rankings (
    id int IDENTITY NOT NULL,
    user_id INT NOT NULL,
    game_poule_id INT NOT NULL,
    rank INT NOT NULL,
    insertDate DATETIME NOT NULL
    );

插入一些示例数据。如果没有更多信息,我无法比这更好地模拟。

INSERT Rankings(user_id,game_poule_id,rank,insertDate)
VALUES(1, 100, 3, CURRENT_TIMESTAMP-2)
INSERT Rankings(user_id,game_poule_id,rank,insertDate)
VALUES(1, 100, 2, CURRENT_TIMESTAMP-1)
INSERT Rankings(user_id,game_poule_id,rank,insertDate)
VALUES(1, 101, 6, CURRENT_TIMESTAMP)
INSERT Rankings(user_id,game_poule_id,rank,insertDate)
VALUES(2, 100, 5, CURRENT_TIMESTAMP-2)
INSERT Rankings(user_id,game_poule_id,rank,insertDate)
VALUES(2, 100, 1, CURRENT_TIMESTAMP-1)
INSERT Rankings(user_id,game_poule_id,rank,insertDate)
VALUES(2, 101, 2, CURRENT_TIMESTAMP)

查询最后一个排名

SELECT Rankings.game_poule_id, Rankings.user_id, rank, MAX(Rankings.insertDate)
FROM Rankings INNER JOIN 
    (SELECT game_poule_id, user_id, MAX(insertDate) max_insert_date 
        FROM rankings 
        GROUP BY game_poule_id, user_id) Max_Ranking_Date
ON Rankings.user_id = Max_Ranking_Date.user_id
    AND Rankings.insertDate < Max_Ranking_Date.max_insert_date
    AND Rankings.game_poule_id = Max_Ranking_Date.game_poule_id
GROUP BY Rankings.game_poule_id, Rankings.user_id, rank 

请注意! 正如您从结果中看到的那样,对于每个用户只有一行的游戏,您不会获得排名。但是由于您要求的是“最后一个”,这仅对具有多个条目的游戏有意义。

编辑: 我刚刚意识到我提供的查询不会为每个游戏的每个用户返回一行。有人想修复它吗?我必须继续做一些工作:)

【讨论】:

  • 谢谢,我还有另一个查询 SELECT * FROM rankings r WHERE FK_gamePoule = 0 AND r.insertDate = COALESCE( (SELECT r2.insertDate FROM rankings r2 WHERE r.FK_user = r2.FK_user ORDER BY r2 .insertDate DESC LIMIT 1 OFFSET 1), '2048-12-31 23:59:59') 但如果你的更好,我会使用它:-)
  • @Derk,您是否设法让您的查询正常工作?我没有时间进一步研究它。
【解决方案2】:

另一种可能(不是很好)的解决方案

SELECT
  *
FROM
  rankings r
WHERE
    FK_gamePoule = 0 AND
  r.insertDate = COALESCE(
    (SELECT
       r2.insertDate
     FROM
       rankings r2
     WHERE
       r.FK_user = r2.FK_user ORDER BY r2.insertDate DESC
     LIMIT 1
     OFFSET 1), '2048-12-31 23:59:59')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多