The current query, which is too slow (can take over 10 seconds):
SELECT
rev.review_id AS review_id,
rev.review_timestamp AS review_timestamp,
(
SELECT COUNT(*)
FROM foo_bar.review_like
WHERE rev.review_id = review_id
) AS likes,
(
SELECT COUNT(*)
FROM foo_bar.review_dislike
WHERE rev.review_id = review_id
) AS dislikes,
(
SELECT COUNT(*)
FROM foo_bar.review_flag
WHERE rev.review_id = review_id
) AS flags
FROM
foo_bar.review AS rev
WHERE
rev.predicate_id = 'some value'
AND
rev.status = 'A'
GROUP BY
rev.review_id,
review_timestamp
ORDER BY
rev.review_timestamp desc
LIMIT 99
Table review has the main data, with tables review_like, review_dislike, and review_flag relating to review by its primary key. (There may be 0-n matches in each of those related tables.) We simply want a count of all likes, dislikes, and flags for all matching reviews, even those excluded by the LIMIT clause. Anyone have a better solution?
I tried something like the following, but it came up with every count being the sum of all likes, dislikes, and flags for all reviews (instead of just the totals for each specific review):
SELECT
rev.review_id AS review_id,
rev.review_timestamp AS review_timestamp,
COUNT(rl.review_id) AS likes,
COUNT(rd.review_id) AS dislikes,
COUNT(rf.review_id) AS flags
FROM foo_bar.review AS rev
INNER JOIN foo_bar.review_like AS rl ON rl.review_id = rev.review_id
INNER JOIN foo_bar.review_dislike AS rd ON rd.review_id = rev.review_id
INNER JOIN foo_bar.review_flag AS rf ON rf.review_id = rev.review_id
WHERE
rev.predicate_id = 'some value'
AND
rev.status = 'A'
GROUP BY
rev.review_id,
review_timestamp
ORDER BY
rev.review_timestamp desc
LIMIT 99