18

次のようにテーブル内のレコードを検索しています。

SELECT Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;

現在、ページングを維持するために LIMIT を追加しています。しかし、ユーザーが単語「prashant」を検索すると、「prashant」の総レコード数は 124 になります。しかし、クエリに制限が適用されるため、PHP スクリプトで 10 レコードしかフェッチされず、PHP コードで mysql 変数をカウントすると、見つかったレコードの合計が 10 と返されます。

したがって、基本的には、単一のクエリを使用してカウントおよび制限したいのですが、上記のクエリを変更して、レコードの合計数 (124) が必要です。クエリで見つかった合計結果をカウントするためだけに別の count(*) クエリを実行したくありません。

ありがとう。

4

5 に答える 5

19
SELECT SQL_CALC_FOUND_ROWS
  Id, Name
FROM my_table
WHERE
  Name LIKE '%prashant%'
LIMIT 0, 10;

# Find total rows
SELECT FOUND_ROWS();

より詳しい情報

于 2009-04-29T13:35:37.720 に答える
10

MySQLはSQL_CALC_FOUND_ROWS、Ionutが述べたようにこれを使用してこれを行うことをサポートしています。ただし、多くの場合、2つのステートメントを使用して昔ながらの方法で実行する方が実際には高速であることがわかります。そのうちの1つは通常のcount()です。ただし、これにはインデックススキャンを使用してカウントを実行できる必要があります。これは、このクエリには当てはまりませんが、とにかく言及したいと思います。

于 2009-04-29T13:38:29.583 に答える
6

これは、同じニーズを持つ他の人のためのものです(この質問の時から3年が経過していることを考慮して)。

同様の問題があり、2つのクエリを作成したくありませんでした。だから私がしたことは、総数の追加の列を作成し、最後にLIMITandOFFSET句を移動することでした:

SELECT SQL_CALC_FOUND_ROWS * FROM (
    SELECT `id`, `name`
    FROM `my_table`
    WHERE `name` LIKE '%prashant%'
) res,
(SELECT /*CEIL(FOUND_ROWS()/10) AS 'pages',*/ FOUND_ROWS() AS 'total') tot
LIMIT 0, 10

したがって、結果は次のようになります

| id  |      name      | total |
+-----+----------------+-------+
|  1  | Jason Prashant |  124  |
|  2  | Bob Prashant   |  124  |
|  3  | Sam Prashant   |  124  |
|  4  | etc. prashant  |  124  |

このソリューションは、結果を1回だけフェッチし、計算済みの行数を追加の列に使用するため、タイミングに不利な点はないと思います。

于 2012-08-05T22:39:04.787 に答える
2

巨大なテーブルで複数のフィールドを選択する場合 (例のように ID、名前だけでなく)、2 つのクエリを使用することをお勧めします。最初にすべての WHERE 句で count(0) を選択してから、ページネーションを作成し、データを選択します。たとえば、人気のある e コマース Web サイトでは非常に高速に動作します。

于 2011-02-07T12:43:50.433 に答える