回答:
最初に注文してから、最初の20を取得します。データベースは、WHERE
before句のすべてを処理しますORDER BY
。
LIMIT
壊れるORDER BY
。戻って間違った結果。何らかの方法で返された結果セットを並べ替えますLIMIT
ORDER BY
LIMIT
ORDER BY
LIMIT句を使用すると、SELECTステートメントによって返される行数を制限できます。LIMITは1つまたは2つの数値引数を取ります。これらは両方とも負でない整数定数でなければなりません(準備済みステートメントを使用する場合を除く)。
2つの引数を使用して、最初の引数は最初に返される行のオフセットを指定し、2番目の引数は返される最大行数を指定します。最初の行のオフセットは0(1ではない)です。
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
特定のオフセットから結果セットの最後までのすべての行を取得するには、2番目のパラメーターに大きな数を使用できます。次のステートメントは、96行目から最後のすべての行を取得します。
SELECT * FROM tbl LIMIT 95,18446744073709551615;
引数が1つの場合、値は結果セットの先頭から返す行数を指定します。
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
つまり、LIMIT row_countはLIMIT 0、row_countと同等です。
@Jamesが言うように、すべてのレコードを並べ替え、最初の20行を取得します。
そのため、最初に公開された20件の記事を確実に取得できます。新しい記事は表示されません。
あなたの状況では、に追加desc
する ことをお勧めしますorder by publish_date
。最新の記事が必要な場合は、最新の記事が最初になります。
結果を昇順で保持する必要があり、さらに最新の10件の記事のみが必要な場合は、mysqlに結果を2回ソートするように要求できます。
以下のこのクエリは、結果を降順で並べ替え、結果を10に制限します(つまり、括弧内のクエリ)。それでも降順で並べ替えられますが、満足できないため、mysqlにもう一度並べ替えるように依頼します。これで、最後の行に最新の結果があります。
select t.article
from
(select article, publish_date
from table1
order by publish_date desc limit 10) t
order by t.publish_date asc;
すべての列が必要な場合は、次の方法で行います。
select t.*
from
(select *
from table1
order by publish_date desc limit 10) t
order by t.publish_date asc;
クエリを手動で記述してデータベースにさまざまなことを調べるときに、この手法を使用します。運用環境では使用していませんが、ベンチマークを行ったところ、余分な並べ替えはパフォーマンスに影響しません。
適切なインデックス(この場合はpublish_date
フィールド)がある場合、MySQLはインデックス全体をスキャンして要求された20レコードを取得する必要はありません。20レコードはインデックスの先頭にあります。ただし、適切なインデックスがない場合は、テーブルのフルスキャンが必要になります。
これについては、2009年のMySQLパフォーマンスブログの記事があります。
このコードを使用できます
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
。0はレコードの開始制限&10レコード数です。
LIMIT 10
はの省略形ですLIMIT 0,10
。
通常、LIMITは最後の操作として適用されるため、結果は最初にソートされてから20に制限されます。実際、ソートは最初の20のソート結果が見つかるとすぐに停止します。
publish_date
のsが等しい場合、それらによる順序LIMIT
付けでは明確な結果が得られないことに注意してください。つまり、ページネーションに使用すると、異なるページに同じアイテムが表示される可能性があります。