2016-10-28 10 views
2

MYSQLに問題があります。 SQL_CALC_FOUND_ROWSおよびFOUND_ROWS()が正しく動作していません。MYSQL。 SQL_CALC_FOUND_ROWSおよびFOUND_ROWS()が正しく動作していません

問題:

  • 初めてトータルリターン1
  • 二度目トータルリターン正しい 数3,500

MySQLバージョン:14.14按分5.7版

のMySQL。 10、EditLineラッパーを使用するosx10.9(x86_64)の場合

テーブルからリストを返そうとしていますが、そのリスト内の別の列が各行に対して繰り返されます。 (選択の合計行を含む)。

私はいずれかを選択してすべてのデータと合計行を取得することができますこの方法...

選択は以下の通りです。

SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS * FROM 
     (SELECT A.MEMBER_ID, A.USERNAME, B.ZIP, B.INTERESTS, C.ADDRESS 
     FROM MEMBER A, DATA B, ADDRESS C   
     WHERE A.GENDER = "F" 
     AND A.MEMBER_ID = B.MEMBER_ID 
     AND A.MEMBER_ID = C.MEMBER_ID 
     AND UPPER (A.CANCEL_FLAG) = "N"  
     ORDER BY A.LAST_LOGIN_DATE DESC) res,  
    (select FOUND_ROWS() as "total_result" from dual) tot  
    Limit 1, 15 
+0

1)は内側のSELECTまたはクロージングべきで正しいBY ORDERですか「)」? 2.)テーブルの種類と構造について少し詳しく知っていますか? – sebkrueger

+0

なぜORDER BYの前に ")"が必要でしょうか? 2))?テーブルは基本テーブルです。私は彼らに特別なことはないと思う。私はテーブルからリストを返そうとしています。そして、各行ごとに繰り返される別の列を返します。合計行を含んでいます。この方法で、1つの選択ですべてのデータと合計行を取得できます。 – philipfwilson

+0

'select FOUND_ROWS() 'は最後のselectで見つかった行の数を示し、現在の行ではありません。あなたが見ているのは期待される結果です。 –

答えて

2

はmysqlでこの仕事をしたい場合は、COUNTを使用して副問合せを行うことができます。 テーブルを数えるだけで、MEMBER_IDが常にDATAADDRESSに存在すると想定できる場合は、テーブルを簡単にすることができます。

SELECT * FROM (
    SELECT A.MEMBER_ID, A.USERNAME, B.ZIP, B.INTERESTS, C.ADDRESS 
     FROM MEMBER A, DATA B, ADDRESS C   
     WHERE A.GENDER = "F" 
      AND A.MEMBER_ID = B.MEMBER_ID 
      AND A.MEMBER_ID = C.MEMBER_ID 
      AND UPPER (A.CANCEL_FLAG) = "N"  
     ORDER BY A.LAST_LOGIN_DATE DESC 
) res, (
    SELECT COUNT(*) as "total_result" 
     FROM MEMBER A 
      JOIN DATA B ON A.MEMBER_ID = B.MEMBER_ID 
      JOIN ADDRESS C ON A.MEMBER_ID = C.MEMBER_ID 
     WHERE A.GENDER='F' 
) tot  
LIMIT 1, 15 

これが恐ろしいかどうかについては、https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/を参照してください。

+1

それはうまくいくはずですが、全体の結果を得るために、クエリ全体を倍増させるためには、私のために神は見えません。私は別のquerysを好むだろう。 1つは「SQL_CALC_FOUND_ROWS」とLIMIT、もう1つは「FOUND_ROWS()」 – sebkrueger

+0

右のリンクを参照して、どちらが効率的であるかについての説明を参照してください。実際には、 "明らかな"答えは必ずしも正しいとは思われない。 –

+0

リンクとperconaのreseachについて知っているが、SQL_CALC_FOUND_ROWSは少し真っ直ぐに見えますが、実際には "COUNT(*)"でどのくらいパフォーマンスが得られますか。 – sebkrueger

0

私はそれを考え出した。

私はストアドプロシージャを使用しています。

私はちょうど2番目の選択をしました。 デュアルから 'total_result'としてFOUND_ROWS()を選択します。

これは正しい値を返しました。 ORDER BYの前に

おかげ フィル

+0

これは動作しますが、で注文しても動作します。私はMySqlとSQL_CALC_FOUND_ROWSを使用しています。 order by節を無効にしているようです。 MySQLサーバのバージョン:5.7.15-0ubuntu0.16.04.1(Ubuntuの)( FROM SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS *は、ORDER BY句を無効にします – philipfwilson

関連する問題