簡體   English   中英

在單個 SQL 語句中使用多個 COUNT 和 SUM

[英]Using multiple COUNTs and SUMs in a single SQL statement

我有一個名為pagespage_viewspage_itemspage_votes的表。 后三個表包含一個page_id外鍵,以便記錄屬於頁面的每個單獨的視圖、項目和投票。

當我查詢一個頁面時,我還想檢索COUNT page_viewsCOUNT page_itemsSUM 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM