mysql 将JOIN与COUNT函数结合使用,并区分喜好和厌恶

t9eec4r0  于 2022-11-21  发布在  Mysql
关注(0)|答案(3)|浏览(170)

我有两个表,其中一个表引用另一个表。

CREATE TABLE blogs (
    article LONGTEXT,
    id VARCHAR(255) PRIMARY KEY
);

CREATE TABLE blog_eval (
    blog_id VARCHAR(255) REFERENCES blogs(id) ON DELETE CASCADE,
    user_id VARCHAR(255) REFERENCES users(id),
    is_like BOOLEAN, --true if like / false if dislike
    PRIMARY KEY (blog_id, user_id)
);

我需要所有博客与两个额外的列:喜欢和不喜欢的总和。
如何将JOIN与COUNT函数结合使用,并区分喜好和厌恶?

kjthegm6

kjthegm61#

连接两个表,使用SUM()计算喜欢和不喜欢的总和。

SELECT b.id, SUM(e.is_like) AS likes, SUM(NOT e.is_like) AS dislikes
FROM blogs AS b
LEFT JOIN blog_eval AS e ON e.blog_id = b.id
GROUP BY b.id
oxosxuxt

oxosxuxt2#

一个选项使用条件计数:

select b.*, e.cnt_dislike, e.cnt_dislike
from blogs b
left join (
    select blog_id, sum(is_like) cnt_like, sum(1 - is_like) cnt_dislike
    from blog_eval
    group by blog_id
) e on e.blog_id = b.id

由于is_like是一个布尔值(本质上是一个整数),表达式sum(is_like)计算真值。在子查询中预聚集可能有助于提高效率。
在最近的MySQL版本(〉= 8.0.14)中,我们可以用横向连接来表达这一点,这可能会表现得更好:

select b.*, e.*
from blogs b
left join lateral (
    select sum(e.is_like) cnt_like, sum(1 - e.is_like) cnt_dislike
    from blog_eval e
    where e.blog_id = b.id
) e on 1 = 1
mnemlml8

mnemlml83#

您 不能 从 一 个 表 中 获取 所 需 的 所有 数据 吗 ?

SELECT blog_id, is_like, count(*)
FROM blog_eval
GROUP BY blog_id, is_like;

中 的 每 一 个

相关问题