繁体   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