При этом будут выбраны TOP 10 viewed
страницы, и будут учитываться элементы и голоса только за эти страницы.
Эффективно, если у вас много страниц, но вам нужно только 10
, устраняет ненужный подсчет.
SELECT (
SELECT COUNT(*)
FROM page_views
WHERE page_views.page_id = pages.id
) AS views_count,
(
SELECT COUNT(*)
FROM page_items
WHERE page_items.page_id = pages.id
) AS items_count,
COALESCE(
(
SELECT SUM(vote)
FROM page_votes
WHERE page_votes.page_id = pages.id
), 0) AS votes_sum
FROM pages
ORDER BY
views_count DESC
LIMIT 10
Еще более эффективный запрос:
SELECT pages.*,
(
SELECT COUNT(*)
FROM page_items
WHERE page_items.page_id = pages.id
) AS items_count,
COALESCE(
(
SELECT SUM(vote)
FROM page_votes
WHERE page_votes.page_id = pages.id
), 0) AS votes_sum
FROM (
SELECT page_id, COUNT(*) AS cnt
FROM page_views
GROUP BY
page_id
ORDER BY cnt DESC
LIMIT 10
) AS pvd,
pages
WHERE pages.id = pvd.page_id
, удаляет ненужные объединения с помощью pages
.