2009-05-25 7 views
4
table { 
    id: long 
    name: string 
} 

1235 Fred 
1902 Trever 
5123 George 
6467 Derek 
7868 Joe 
8972 Bob 
9272 Alf 
9842 Hank 

私はジョーズのそれより前に2つのレコードを返したいと思っています。昇順オーダーです。制限付きSQLソート?

すなわち正しい値は次のようになります。

5123 George 
6467 Derek 

任意の考え? FYI:

  1. 戻り間違った行:

    がID ASCの制限により、ID < 7868オーダー2

  2. 戻り、誤ったソート順でテーブルから選択*:

    でテーブルから選択* id < 7868 order by id desc limit 2

+0

使用されるデータベースはSQLiteですが、他のRDBMSに関してこれを止めさせませんとにかく知ってうれしいです:D – Matt

答えて

4
SELECT * FROM 
    (select * from table where id<7868 order by id desc limit 2) AS foo 
ORDER BY ID ASC 
+0

ありがとうアレックス。驚くほど十分にそのSQLiteによってサポートされても! :D – Matt

+0

ああ、SQLiteはネストされたものを選択して右だけでなく他のものも選択します - amazin 'little beast、innit! - ) –

+0

実際には - それは解析しても外来のキー制約を強制しません。 – Matt

1

試してみてください。

*

を選択し、「表」から:あなたが最初の正しい行を取得することができますサブクエリを行う

Select * from (
    select * from table with id<7868 
    order by id desc limit 2 
) as t order by id asc 

、そしてあなたは、PostgreSQLではその後

0

それらを並べ替えることができますid < id by asc limit 2 offset 2

同様にMySQLでは(私は)「制限2、2」

"LIMIT 2 OFFSET 2"もSQLiteでも動作します(3.6.13)

+0

質問に記載されているデータを使用するときに正しい結果が返されますが、私はそのデータがほんの小さな、単純な例であると推測しています。同様に、 "SELECT * FROM table WHERE id IN(5123,6467)ORDER BY id"は、サンプルデータで正しい結果を返しますが、一般的な場合は役に立たないです。 – LukeH

+0

こんにちは。応答していただきありがとうございます。 オフセット自体には、必要な結果の開始位置を知る必要があります。それは提供されたデータで動作しますが、オフセットを知ることができない場所では十分に柔軟ではありません。たとえば、3つの結果が必要な場合は、オフセットを1に変更する必要があります。しかし、あなたの努力に感謝します! – Matt