2017-09-08 12 views
1

これは恐らく重複としてノックされるだろうと確信していますが、私の人生はSQLのクエリで何が起こっているのか理解できません。現在私は1)への2つの別々のクエリを実行しています。私が望むテーブルの内容と2)を集めてください。代わりに同じクエリを実行してください。ダムSQL Q:クエリからのカウント

最初のものが最初です。それはポストグルです。クエリでは制限句でページを区切られているので、私は悪いスタートを切っていると思いますが、私はダムの質問に既にコミットしているかもしれません。

SELECT * 
     FROM test_case_versions v 
      INNER JOIN test_cases t ON v.version_id = t.current_version 
      LEFT OUTER JOIN categories_full c ON c.category_id = t.category_id 
      INNER JOIN test_case_labels tcl ON tcl.test_case_id = t.test_case_id 
      INNER JOIN labels l on l.label_id = tcl.label_id 
     WHERE c.product_id = " . $user->product_id . " 
      AND label_name ILIKE '$search2' 
     ORDER BY t.test_case_id ASC 
     LIMIT " . SEARCH_RESULTS_PER_PAGE . " OFFSET $offset"; 

この文は私にresult_setを与えますが、以下の制限節のために結果を100回戻すだけです。 合計結果を数えるためにlimit句を実行する前に、またはこれはできないのですか?

すべてのヘルプは大幅にこのような

+0

結果として100レコードを取得する前に合計レコード数をカウントすることを意味する – Rams

+0

したがって、このコマンドをそのまま実行すると、含めることに失敗したSEARCH_RESULTS_PER_PAGE番号でクエリが停止します。その数が戻ってくるだけで次のページに移動するので、100を超える結果が表示されます。 – baksyl

答えて

3

何かがうまくいくかもしれないいただければ幸いです。

SELECT * 
    FROM (SELECT v.*, 
       t.*, 
       c.*, 
       tcl.*, 
       l.*, 
       COUNT(*) OVER() AS cnt 
      FROM test_case_versions v 
     INNER 
      JOIN test_cases t 
      ON v.version_id = t.current_version 
      LEFT 
      JOIN categories_full c 
      ON c.category_id = t.category_id 
     INNER 
      JOIN test_case_labels tcl 
      ON tcl.test_case_id = t.test_case_id 
     INNER 
      JOIN labels l 
      ON l.label_id = tcl.label_id 
     WHERE c.product_id = " . $user->product_id . " 
      AND label_name ILIKE '$search2' 
     ) AS TMP 
ORDER 
    BY test_case_id ASC 
LIMIT " . SEARCH_RESULTS_PER_PAGE . " OFFSET $offset"; 
2

私はこの質問を多く受けています。私の答えは常に同じです。なぜ、行の正確な数を知る必要がありますか?あなたはGoogleで何かを調べるときにヒット数を見たことがありますか?もしそうなら、正確な数字だと思いますか? ページングの目的は、サーバ(およびネットワーク)の負担を制限することです。すべてのレコード数をカウントすると、その目的を凌駕します。

+0

これはもともと正直にデザインされた方法であり、私はできるだけ変更を加えることを任されてきました。それは華麗ではないかもしれませんが、残るべき機能です。 – baksyl

+0

もしあなたが本当に必要なのなら...一口... 2つの別々のクエリが意味をなさない。それらを非同期に実行すると、少なくともカウント・クエリはユーザー・インターフェースと実際の結果を駄目にしません。 –