2016-01-02 14 views
5

私はユーザーを見つけるための検索ページを作っています。私はそれらを見つけるためにqueクエリを持っており、実際には "LIMIT startRow、numberRows"でページネーションを実行できます。しかし、どのようにページングを行う前に見つかった "レジスタ"の総数を数えることができますか?私は検索ページに、検索で見つかったユーザーの数を追加したいと思います。MySQL - ページングする前に行を数える方法は?

「ページ1の100」のようなものが必要です。私は実際に「ページ1」を持っていますが、ページ付けする前に合計結果を数える方法はわかりません。

¿ "SELECT COUNT(*)"で余分なクエリを実行する必要がありますか? ¿別のクエリを避けるために、改ページの前に数えられる別の方法がありますか?

は、私は2つのSQLクエリ、単一の単語のための1つを使用して、マルチワードのための別:

"SELECT * FROM accounts AS A INNER JOIN profiles AS P ON A.account_id = P.account_id " 

シングルワード条件:

(単一の単語とマルチワード検索用)

ベースのSQLクエリ

"WHERE A.username LIKE ? OR P.name LIKE ? OR P.name LIKE ? OR P.surname LIKE ? OR P.surname LIKE ? LIMIT ?,?" 

マルチワード条件:

"WHERE CONCAT(P.name, ' ', P.surname) LIKE ? LIMIT ?,?" 

ありがとうございました。

+0

あなたは[displaytag](http://www.displaytag.org/1.2/)を使用することはできませんいくつかの理由がありますか? –

+0

私はそのライブラリについて知らなかった。私が必要とする別の検索方法について興味深いようです。それにもかかわらず、ページ分割前の合計結果を数えたいと思っています。なぜなら、私は学んでいるからです。ありがとうございました。 – wilmerlpr

答えて

2

このようなクエリを変更します。

SELECT SQL_CALC_FOUND_ROWS * FROM accounts ... LIMIT ... 

これは、(例えば、結果の最初のページ、)前と同じ限定/オフセット結果を返しますが、その後すぐに、この2番目のクエリを送信する場合サーバー...

SELECT FOUND_ROWS(); 

サーバはLIMITは、前のクエリに課されていなかった場合に返されていたであろう行の合計数のカウントを返します。結果の総数があります。

これはもちろん、オプティマイザがLIMITが満たされた時点で行の評価を停止する可能性のあるショートカットを実行できないため、最初のクエリに時間がかかることを意味しますが、そのようなショートカットはとにかく利用可能です。

これは、達成しようとしていることを実行するための「公式の」メカニズムです。

http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows

+1

最後に!それは私がsp発作。 「like」フィルタで多くのリソースを消費することなく、小さなクエリ。ご回答有難うございます。 – wilmerlpr

0

あなたが使用することができますが、このような何かを:

代わりに、すべての(*)、使用する各列名を選択する
SELECT (select count(*) from produtos) as counter, column1, column2, column3, column4 FROM accounts AS A INNER JOIN profiles AS P ON A.account_id = P.account_id WHERE A.username LIKE ? OR P.name LIKE ? OR P.name LIKE ? OR P.surname LIKE ? OR P.surname LIKE ? LIMIT ?,?; 

、とはカウンターと呼ばれる別の列を作成します。

+0

"WHERE"フィルタを省略したデータベース内のエントリの総数のみが表示されます。私が "SELECT COUNT(*)AS total、column2、..."にそれを掛ければ"WHERE"フィルタと一致する行数を表示しますが、mysqlの結果にはクエリの最初の行が1つしかなく、実際にはその合計の新しい列があります。 – wilmerlpr

+0

これはどうですか? SELECT(カウント(*)をアカウントから選択してください)AS INNER JOINプロファイルをAS P ONにします。A.account_id = P.account_id WHERE A.username LIKE?またはP.name LIKE?またはP.name LIKE?またはP.sameame LIKE?またはP.sameame LIKE?)カウンター、列1、列2、列3、列4からFROM accounts in INNER JOINプロファイルas AS P ON A.account_id = P.account_idどこにA.usernameが好きかP.nameが好きですかP.nameが好きですかPさんの名前が好きですかPさんの名前が好きですか? 種類が大きく、私はそれが助けてくれることを願っています:) –

関連する問題