[英]Using multiple COUNTs and SUMs in a single SQL statement
I have a tables called pages , page_views , page_items and page_votes .我有一个名为pages 、 page_views 、 page_items和page_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_views 、 COUNT page_items和SUM 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.