2017-06-09 9 views
1

私はこのようなほとんどの複雑なクエリがあります。LIMITを適用する前に、選択した行の合計をどのように数えますか?

SELECT qa.id, 
      qa.subject, 
      qa.category cat, 
      qa.keywords tags, 
      qa.body_html, 
      qa.amount, 
      qa.visibility, 
      qa.date_time, 
      COALESCE(u.reputation, 'N') reputation, 
      COALESCE(Concat(u.user_fname, ' ', u.user_lname), 'unknown') NAME, 
      COALESCE(u.avatar, 'anonymous.png') avatar, 
      ( 
       SELECT COALESCE(Sum(vv.value),0) 
       FROM votes vv 
       WHERE qa.id = vv.post_id 
       AND 15 = vv.table_code) AS total_votes, 
      ( 
       SELECT COALESCE(Sum(vt.total_viewed),0) 
       FROM viewed_total vt 
       WHERE qa.id = vt.post_id 
       AND 15 = vt.table_code limit 1) AS total_viewed 
FROM  qanda qa 
LEFT JOIN users u 
ON  qa.author_id = u.id 
AND  qa.visibility = 1 
WHERE  qa.type = 0 $query_where 
ORDER BY $query_order 
LIMIT  :j, 11; 

$query_where変数が動的に作成されますいくつかの他の条件が含まれていることを指摘しました。とにかく、あなたが見るように、最大​​10の投稿を返します。

は現在、総マッチした行をカウントするために、私はこのような別のクエリを使用します。

SELECT COUNT(amount) paid_qs, 
     COUNT(*) all_qs 
FROM qanda qa 
WHERE type = 0 $query_where 

私はいくつかの廃棄物処理があると思います。私は2つの別々のクエリwhere句の複雑な条件付き)が多すぎることを意味します。

それらの代わりに1つのクエリを使用する方法はありますか?

+0

クエリの処理に要する時間を記録すると、それを2回実行するのがどれほど高速かに驚かれることがあります。 – WheatBeak

+0

FETCH_ROWS()を使用したSQL_CALC_FOUND_ROWSは別の良い解決策です。 – avisheks

答えて

4

FOUND_ROWS()関数を使用してクエリの後に見つかった行をクエリできます。

参考:MySQL Reference Manual

あなたはあなたのクエリにSELECT SQL_CALC_FOUND_ROWS ...句を含める必要があります。

+0

まあ、ありがとう.. upvote。しかし、正直なところ私はそれをどのように使うことができるのか分かりません。ご覧のとおり、私の2番目のクエリは、1)すべての投稿、2)有料の投稿の2つをカウントします。ソリューションを使用して同じことを行うにはどうすればよいですか? –

+0

私はそれがどれくらいの行を持っているか、どのくらい複雑なクエリがあるかによって異なりますが、私は個人的にこのアプローチが2つのクエリを使用するよりも約3倍遅くなることを発見しました。 – WheatBeak

+0

@ MartineAJ参照してください。私はここで2つのクエリをスペアすることはできないと思います。なぜなら、2つの結果セットが全く異なるからです。私はサブクエリについて考えましたが、それはどちらもうまくいかないでしょう。 – gaborsch

関連する問題