微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以减少这个查询吗?

如何解决我可以减少这个查询吗?

我有一个表名 likes,用于存储有关帖子的喜欢和不喜欢的详细信息。要显示帖子的总点赞数,我需要计算喜欢和不喜欢之间的差异。现在我将喜欢存储在名为 liked 的列中,该列的类型为 bool。这个想法是,如果喜欢,则将其设置为真,不喜欢为假。我的桌子看起来像这样,

| id | user_id | post_id | liked | 
| -- | ------- | ------- | ----- |
| 1  | 1       | 1       | true  |
| 2  | 7       | 1       | false |
| 3  | 12      | 1       | true  |

我使用了 SELECT liked,COUNT(*) FROM likes WHERE post_id=1 GROUP BY liked;,它返回了

| liked | count |
| ----- | ----- |
| TRUE  | 2     |
| FALSE | 1     |

我想看看这两者之间的区别。似乎找不到任何东西,所以我尝试了
SELECT SUM((SELECT COUNT(*) FROM likes WHERE post_id=1 AND liked = true) - (SELECT COUNT(*) FROM likes WHERE post_id=1 AND liked = false));

返回我想要的

| SUM |
| --- |
| 1   |

但我仍然觉得这个查询是不正确的。有没有更好的方法来编写这个查询

解决方法

这里有两个选项:

SELECT COUNT(*) FILTER (WHERE liked) - COUNT(*) FILTER (WHERE NOT liked)
FROM likes
WHERE post_id = 1;

SELECT SUM(CASE WHEN liked THEN 1 ELSE -1 END)
FROM likes
WHERE post_id = 1;
,

一般的解决方案是分两步进行聚合:

select max(cnt) - min(cnt)
from
(
  select count(*) cnt FROM likes WHERE post_id=1 GROUP BY liked
) dt

在您的情况下,只有两个不同的值可以使用条件聚合:

select abs(count(*) filter (where c1 = true) - count(*) filter (where c1 = false))
from b
WHERE post_id=1 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。