条件に一致した行の周囲の行のグループを選択したい。つまり、行を選択してから、その前後の 5 つのレコードを返します。
リクエストされた詳細情報(申し訳ありません!)
では、テーブルにはレースのラップ タイムが記録されています。ラップはユーザーに関連しています (ユーザーは多くのラップを持っています)。ユーザーのベストラップタイムを見つけてから、必要なユーザーのベストラップの上と下のUNIQUEユーザーからのベストラップのx数を見つけたいです。
これは可能ですか?
条件に一致した行の周囲の行のグループを選択したい。つまり、行を選択してから、その前後の 5 つのレコードを返します。
リクエストされた詳細情報(申し訳ありません!)
では、テーブルにはレースのラップ タイムが記録されています。ラップはユーザーに関連しています (ユーザーは多くのラップを持っています)。ユーザーのベストラップタイムを見つけてから、必要なユーザーのベストラップの上と下のUNIQUEユーザーからのベストラップのx数を見つけたいです。
これは可能ですか?
これにはかなりのハッキングが必要でしたが、私の側ではうまくいっているようです。
SELECT *
FROM `lap_times`
WHERE `id` IN (
SELECT * FROM (
SELECT lt1.id
FROM `lap_times` lt1
WHERE lt1.time = (SELECT MIN(lt2.time) FROM `lap_times` lt2 WHERE lt2.user_id = lt1.user_id)
AND lt1.time <= (SELECT MIN(lt3.time) FROM `lap_times` lt3 WHERE lt3.user_id = 2)
AND lt1.user_id != 2
ORDER BY lt1.time ASC
LIMIT 5
) AS `tbl1`
) OR `id` = (
SELECT `id`
FROM `lap_times`
WHERE `user_id` = 2
ORDER BY `time` ASC
LIMIT 1
) OR `id` IN (
SELECT * FROM (
SELECT lt1.id
FROM `lap_times` lt1
WHERE lt1.time = (SELECT MIN(lt2.time) FROM `lap_times` lt2 WHERE lt2.user_id = lt1.user_id)
AND lt1.time >= (SELECT MIN(lt3.time) FROM `lap_times` lt3 WHERE lt3.user_id = 2)
AND lt1.user_id != 2
ORDER BY lt1.time ASC
LIMIT 5
) AS `tbl2`
)
ORDER BY `time` ASC;
次のようになります。
lap_time = column with lap times (assumed to be an int or numeric)
laps = table containing lap times
CURRENT_LAP_TIME = the lap time in question
それから
SELECT lap_time FROM laps
WHERE lap_time < CURRENT_LAP_TIME
ORDER BY lap_time DESC LIMIT 5
UNION
SELECT lap_time FROM laps
WHERE lap_time >= CURRENT_LAP_TIME
ORDER BY lap_time LIMIT 6
全体を別の SELECT ステートメントでラップし、特定の順序で並べたい場合は ORDER BY を実行できます。(最初の SELECT ステートメントを逆にするより良い方法があると思いますが、頭の中で思いつきません。)
ラップタイムで並べ替えたいとします。
SELECT `lap_time`, `uid`
FROM `table`
WHERE `uid` = x AND `lapnum` = y
これにより、最後のラップの行が取得されます。INTとして保存され、秒単位であるとしましょう。そして結果は120です。
すべてのラップタイムをすばやく選択できるようになりました。
SELECT `lap_time`, `uid`
FROM `table`
WHERE `laptime` =< 120
GROUP BY `uid`
ORDER BY `laptime` DESC
LIMIT 5
そして最後に、すべてのラップタイムを遅く選択します。
SELECT `lap_time`, `uid`
FROM `table`
WHERE `laptime` >= 120
GROUP BY `uid`
ORDER BY `laptime` ASC
LIMIT 5
これで、必要な 11 行すべてが得られます。
非常にまばらなデータを考えると、非常に一般的なソリューションしか提供できません。それをインスピレーションと考えてください:
SELECT
id,
fieldX,
ABS(id - <id-to-select>) AS distance
FROM
table
WHERE
ABS(id - <id-to-select>) < 5
ORDER BY
distance DESC
ただし、このメソッドは、を含む行が返されることを保証しません。id = <id-to-select>
この ID に「最も近い」行を返すだけです。
繰り返しますが、これはインスピレーションの源としてのみ意図されています。