私はこのようなほとんどの複雑なクエリがあります。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つのクエリを使用する方法はありますか?
クエリの処理に要する時間を記録すると、それを2回実行するのがどれほど高速かに驚かれることがあります。 – WheatBeak
FETCH_ROWS()を使用したSQL_CALC_FOUND_ROWSは別の良い解決策です。 – avisheks