[英]Using multiple COUNTs and SUMs in a single SQL statement
我有一個名為pages 、 page_views 、 page_items和page_votes的表。 后三個表包含一個page_id外鍵,以便記錄屬於頁面的每個單獨的視圖、項目和投票。
當我查詢一個頁面時,我還想檢索COUNT page_views 、 COUNT page_items和SUM page_votes.vote 。
我在下面粘貼了一個查詢。 它檢索視圖總數。 我已經進行了各種嘗試來添加項目和投票,但結果要么是語法錯誤,要么是視圖/項目/投票返回為相同且“錯誤”的數字,可能是由於我加入的方式。
如何向此查詢添加項目和投票?
SELECT
Page.*,
COUNT(*) AS views
FROM pages AS Page
INNER JOIN page_views AS PageView
ON Page.id = PageView.page_id
GROUP BY Page.id
ORDER BY views DESC
LIMIT 10 OFFSET 0
這將 select 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
連接。
假設我正確閱讀了您的 SQL 並且您想要按瀏覽量排名前 10 的頁面,請嘗試以下操作:
SELECT p.*,
(SELECT SUM(views) FROM page_views WHERE page_id = p.page_id) views,
(SELECT SUM(votes) FROM page_votes WHERE page_id = p.page_id) votes,
(SELECT SUM(items) FROM page_items WHERE page_id = p.page_id) items
FROM pages p
ORDER BY views DESC
LIMIT 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.