[英]MySQL: return count of several items for each row
我有一张列出一些项目的表格。
然后我有 3 个不同的表,每个表都记录了针对某个项目执行的各种操作,以及日期和执行者:
Table "items":
item_id, title, description
Table "item_views":
item_id, date, user_id
Table "item_follows":
item_id, date, user_id
Table "item_likes":
item_id, date, user_id
我正在尝试提出一个查询,该查询将列出每个项目,以及在其他 3 个表中的每个表中引用它们的次数。
它只需要计算两个给定日期之间的操作,而且我还需要能够按任何计数器排序。
所以我会给它两个日期并说“按喜欢排序”,它会返回如下内容:
item id item title views_counter follows_counter likes_counter
item1 Some title 0 5 6
item2 Some title 4 0 4
item3 Some title 3 2 0
任何建议将不胜感激,在此先感谢!
您可以使用union all
和聚合:
select i.*,
sum(which = 'view') as views,
sum(which = 'follow') as follows,
sum(which = 'like') as likes
from items i left join
((select item_id, 'view' as which
from item_views
) union all
(select item_id, 'follow' as which
from item_follows
) union all
(select item_id, 'like' as which
from item_likes
)
) vfl
on i.item_id = vfl.item_id
group by i.item_id;
对查找计数的子查询使用左连接:
SELECT
i.item_id,
i.title,
COALESCE(v.view_cnt, 0) AS views_counter,
COALESCE(f.follow_cnt, 0) AS follows_counter,
COALESCE(l.like_cnt, 0) AS likes_counter
FROM items i
LEFT JOIN
(
SELECT item_id, COUNT(*) AS view_cnt
FROM item_views
GROUP BY item_id
) v
ON v.item_id = i.item_id
LEFT JOIN
(
SELECT item_id, COUNT(*) AS follow_cnt
FROM item_follows
GROUP BY item_id
) f
ON f.item_id = i.item_id
LEFT JOIN
(
SELECT item_id, COUNT(*) AS like_cnt
FROM item_likes
GROUP BY item_id
) l
ON l.item_id = i.item_id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.