0

レース選手権の順位データを格納するテーブルがあります。問題は、ドライバーの位置を実際に保存するのではなく、ポイント数を他のデータ (勝利数など) と共に保存し、MySQL にソートさせることです。通常はこれで問題ありませんが、特定のシーズンにおけるドライバーの位置を知りたい場合はどうすればよいでしょうか。次のコードを使用できます。

SELECT  l.driver, @curRow := @curRow + 1 AS position
FROM    driverStandings l
JOIN    (SELECT @curRow := 0) r
WHERE   l.season = 1
ORDER BY l.points DESC, l.racesWon DESC

ただし、これはシーズン 1 でのすべてのドライバーとそのポジションのリストを返します。ドライバー (「ベッテル」など) のポジションを知りたいだけの場合、どうすればよいでしょうか? 考えられる限りのことを試しましたが、無駄でした。

4

3 に答える 3

2
SELECT       COUNT(v.id) + 1
FROM         driverStandings d
  LEFT JOIN  driverStandings v
         ON  d.points > v.points
         OR (d.points = v.points AND d.racesWon > v.racesWon)
WHERE        v.id = ?

必要に応じて、GROUP BYフィルター処理の代わりに使用できます (ただし、各レコードを識別できるようv.idに、リストに追加することを忘れないでください)。SELECT

于 2013-01-20T20:29:58.197 に答える
0

元の投稿へのコメントに記載されているように、実際には位置を明示的に保存する必要があります。これにより、この問題を取り巻くすべてのコードがよりクリーンになります。

不活性を使用した例のように、新しいドライバー位置フィールドが現在の行で埋められるように値を埋めることができるはずです...選択

ただし、サブクエリを使用して同じ情報を非効率的に取得することもできます

于 2013-01-20T20:18:14.990 に答える
0

ポイントがそのドライバーのポイントよりも大きい選択カウントを行います。これは 2 番目のクエリで最も簡単ですが、競合状態が発生する可能性があります (しゃれは意図されていません)。

(count(*) + 1) を driverStandings l からの位置として選択 l.points > :driverPoints

于 2013-01-20T20:08:57.137 に答える