[解決済み] LIMIT/OFFSETを指定してクエリを実行し、総行数を取得することも可能
質問
ページネーション用に
LIMIT
と
OFFSET
節があります。しかし、このクエリで返される行数のカウントも必要です。
LIMIT
と
OFFSET
節があります。
走りたい。
SELECT * FROM table WHERE /* whatever */ ORDER BY col1 LIMIT ? OFFSET ?
そして
SELECT COUNT(*) FROM table WHERE /* whatever */
同時にです。 特にPostgresに最適化させて、両方を個別に実行するよりも速くなるような方法はありますか?
どのように解決するのですか?
はい、そうです。 簡単なウィンドウ機能で
SELECT *, count(*) OVER() AS full_count
FROM tbl
WHERE /* whatever */
ORDER BY col1
OFFSET ?
LIMIT ?
コストは総数なしの場合よりも大幅に高くなりますが、通常、2つの別々のクエリよりも安くなることに注意してください。Postgresは実際に すべての行を数える どちらの方法でも、対象となる行の総数に応じてコストが発生します。詳細はこちら
しかし
,
ダニさんご指摘の通り
は、いつ
OFFSET
が少なくともベースクエリから返される行の数と同じであれば、行は返されません。ですから、私たちも
full_count
.
それが受け入れられない場合、考えられるのは
常にフルカウントを返すようにするための回避策
は、CTEと
OUTER JOIN
:
WITH cte AS (
SELECT *
FROM tbl
WHERE /* whatever */
)
SELECT *
FROM (
TABLE cte
ORDER BY col1
LIMIT ?
OFFSET ?
) sub
RIGHT JOIN (SELECT count(*) FROM cte) c(full_count) ON true;
で1行のNULL値を取得します。
full_count
が追加された場合
OFFSET
が大きすぎる。そうでなければ、最初のクエリのように、すべての行に追加されます。
すべてのNULL値を持つ行が有効な結果となる可能性がある場合、以下のようにチェックする必要があります。
offset >= full_count
を使用して、空の行の起源を曖昧にすることができます。
これでも、基本クエリは一度だけ実行されます。しかし、これはクエリに多くのオーバーヘッドを追加し、それがカウントのために基本クエリを繰り返すよりも少ない場合にのみ支払われるようにします。
最終的なソート順をサポートするインデックスが利用できる場合は
ORDER BY
をCTEで(冗長的に)使用します。
関連
-
[解決済み] SQLの結合形式 - 入れ子になった内側join
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] SQL SELECT WHERE フィールドに単語が含まれる場合
-
[解決済み] SQL Server テーブルからランダムな n 行を選択する
-
[解決済み】Oracleクエリが順序付け後に返す行数を制限するにはどうすればいいですか?
-
[解決済み】countとgroup byを同じselect文で使用する方法
-
[解決済み】MYSQLのLIMITオフセットが高いと、なぜクエリが遅くなるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL】1136 - 列数が1行目の値数と一致しない問題を解決
-
[解決済み] SQL Serverで実行中の合計を計算する
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] カラム名の変更 SQL Server 2008
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] mysqldumpで特定のテーブルをスキップする
-
[解決済み] Selectステートメントで特定のフィールドの重複を検索する
-
[解決済み] PostgreSQLのテーブルの行数を発見する高速な方法