[英]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.