1

私のテーブル構造は次のようになります。

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 内のすべてのユーザーについて、テーブルの最後から 2 つ目のランクを取得したいと考えています。

誰かがこれを達成する方法を知っていますか? ありがとう

4

2 に答える 2

0

必要なレコードを取得するには、テーブルを自己結合する必要があります。この回答では、外部キーを使用せずにテーブルを作成しました。外部キーを機能させるために必要ないためです。

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)

最後の1つのランクを照会する

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 

ご注意ください!結果からわかるように、ユーザーごとに1行しかないゲームのランキングは取得されません。しかし、あなたは「最後の1つ」を求めているので、複数のエントリを持つゲームにのみ意味があります。

編集:私が提供したクエリは、ゲームごとにユーザーごとに1行を返さないことに気づきました。誰かがそれを修正したいですか?私はいくつかの仕事に取り掛かる必要があります:)

于 2010-05-05T14:05:21.583 に答える
0

別の可能な(あまり良くない)解決策

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')
于 2010-05-05T15:15:55.493 に答える