2

条件に一致した行の周囲の行のグループを選択したい。つまり、行を選択してから、その前後の 5 つのレコードを返します。

リクエストされた詳細情報(申し訳ありません!)

では、テーブルにはレースのラップ タイムが記録されています。ラップはユーザーに関連しています (ユーザーは多くのラップを持っています)。ユーザーのベストラップタイムを見つけてから、必要なユーザーのベストラップの上と下のUNIQUEユーザーからのベストラップのx数を見つけたいです。

これは可能ですか?

4

5 に答える 5

2

これにはかなりのハッキングが必要でしたが、私の側ではうまくいっているようです。


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;

于 2009-12-08T13:22:53.807 に答える
1

次のようになります。

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 ステートメントを逆にするより良い方法があると思いますが、頭の中で思いつきません。)

于 2010-01-26T12:07:12.033 に答える
1

ラップタイムで並べ替えたいとします。


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 行すべてが得られます。

于 2009-12-08T01:16:41.357 に答える
0

非常にまばらなデータを考えると、非常に一般的なソリューションしか提供できませ。それをインスピレーションと考えてください:

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 に「最も近い」行を返すだけです。

繰り返しますが、これはインスピレーションの源としてのみ意図されています。

于 2009-12-03T11:03:46.247 に答える