繁体   English   中英

MySQL:返回每行几个项目的计数

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM