简体   繁体   English

在单个 SQL 语句中使用多个 COUNT 和 SUM

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

I have a tables called pages , page_views , page_items and page_votes .我有一个名为pagespage_viewspage_itemspage_votes的表。 The latter three tables contain a page_id foreign key in order to keep a record of each individual view, item and vote that belongs to a page.后三个表包含一个page_id外键,以便记录属于页面的每个单独的视图、项目和投票。

When I query a page, I also want to retrieve COUNT page_views , COUNT page_items and SUM page_votes.vote .当我查询一个页面时,我还想检索COUNT page_viewsCOUNT page_itemsSUM page_votes.vote

I have pasted a query below.我在下面粘贴了一个查询。 It retrieves the total number of views.它检索视图总数。 I've made various attempts to add items and votes to it, but the result is either a syntax error or views/items/votes returned as an identical and "wrong" number, probably due to the way I am joining.我已经进行了各种尝试来添加项目和投票,但结果要么是语法错误,要么是视图/项目/投票返回为相同且“错误”的数字,可能是由于我加入的方式。

How can I add items and votes to this query?如何向此查询添加项目和投票?

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

This will select TOP 10 viewed pages, and will count items and votes only for these pages.这将 select TOP 10 viewed页面,并将仅计算这些页面的项目和投票。

Efficient if you have lots of pages but need only 10 of them, eliminates unneeded counting.如果您有很多页面但只需要其中的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

Even more efficient query:更高效的查询:

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

, eliminates unneeded joins with pages . ,消除了不需要的pages连接。

Assuming I read your SQL correctly and you want the top 10 pages by views, try this:假设我正确阅读了您的 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