2

次のような構造のテーブルがあります。

スキーマ図

各プレーヤーの最新のハンディキャップを選択しようとしているため、日付と playerId で並べ替えています。

次のクエリを検討してください。

SELECT h.id, h.playerId, h.amount, h.date
FROM hancicap h
WHERE h.date < '2012-06-11'
ORDER BY h.playerId ASC, h.date DESC

次のような結果が得られます。

サンプルデータ

(下線付きの行は、私が返したい行です)

私の最初の考えは、を追加するGROUP BY h.playerIdことでしたが、それは間違った値になります。私は完全に立ち往生しており、すべての提案や考えに感謝します!

スレッド名を何にしようか迷いました。名前をより正確にするための編集は素晴らしいでしょう。

4

3 に答える 3

4

サブクエリを使用して、最新の行を除外できます。

select  *
from    players p1
where   p1.id =
        (
        select  id
        from    players p2
        where   p2.playerId = p1.playerId
        order by
                date desc
        limit   1
        )
于 2012-06-13T07:53:04.060 に答える
1

キーで定義すると(すでにインデックスがあります)、結合は常に高速になります。

SELECT a.* 
FROM   hancicap a 
       LEFT JOIN hancicap b 
              ON a.playerId = b.playerId 
                 AND a.date < b.date 
                 AND ( a.date < '2012-06-11' 
                        OR b.date < '2012-06-11' ) 
WHERE  b.playerId IS NULL 
于 2012-06-13T08:14:44.677 に答える
0
SELECT h.id, h.playerId, h.handicap, h.date
FROM handicap h
WHERE h.date < '2012-06-11'
    and h.date = (SELECT max(h2.date) FROM handicap h2
                    WHERE h2.date < '2012-06-11' and h.playerId = h2.playerId)

私のテストデータは次のとおりです。

id          playerId    handicap    date
----------- ----------- ----------- ----------
1           1           2           2012-06-05
2           1           3           2012-06-07
3           1           1           2012-06-08
4           1           12          2012-06-13
5           2           1           2012-06-09
6           2           4           2012-06-01
7           2           5           2012-06-10

(7 row(s) affected)

id          playerId    handicap    date
----------- ----------- ----------- ----------
7           2           5           2012-06-10
3           1           1           2012-06-08

(2 row(s) affected)
于 2012-06-13T07:56:51.530 に答える