sql - 态度是多对多。我的参与。PostgreSQL
问题描述
我有三个表t_items,t_users,items_likes。
create table t_items (
item_id varchar PRIMARY KEY,
title varchar);
create table t_users(
user_id varchar PRIMARY KEY,
title varchar);
CREATE TABLE items_likes (
like_id varchar PRIMARY KEY,
item_id varchar references t_items(item_id),
user_id varchar references t_users(user_id));
insert into t_items values('it1', 'item1');
insert into t_items values('it2', 'item2');
insert into t_items values('it3', 'item3');
insert into t_items values('it4', 'item4');
insert into t_items values('it5', 'item5');
insert into t_items values('it6', 'item6');
insert into t_items values('it7', 'item7');
insert into t_items values('it8', 'item8');
insert into t_items values('it9', 'item9');
insert into t_items values('it0', 'item0');
insert into t_users values('user1', 'name1');
insert into t_users values('user2', 'name2');
insert into t_users values('user3', 'name3');
insert into t_users values('user4', 'name4');
insert into t_users values('user5', 'name5');
insert into items_likes values('li1', 'it1', 'user1');
insert into items_likes values('li2', 'it2', 'user1');
insert into items_likes values('li3', 'it2', 'user2');
insert into items_likes values('li4', 'it3', 'user2');
insert into items_likes values('li5', 'it3', 'user3');
insert into items_likes values('li6', 'it1', 'user3');
insert into items_likes values('li7', 'it4', 'user4');
insert into items_likes values('li8', 'it2', 'user4');
insert into items_likes values('li9', 'it5', 'user5');
insert into items_likes values('li0', 'it1', 'user5');
我需要一个请求来显示用户喜欢的总次数。在这里,这样的请求只给出了我喜欢的数量。我需要喜欢的总数。
select
t_items.item_id,
t_items.title,
count(distinct items_likes.like_id) as likes_count
from t_items
LEFT OUTER join items_likes on t_items.item_id = items_likes.item_id and items_likes.user_id = 'user3'
where
items_likes.user_id = 'user3'
group by t_items.item_id, items_likes.user_id;
我有错误的结果:
item_id title likes_count
1 it1 item1 1
2 it3 item3 1
我需要结果:
item_id title likes_count
1 it1 item1 3
2 it3 item3 2
如何查看我参与的点赞总数?
解决方案
select
t_items.item_id,
min(t_items.title) as title,
count(case when item_likes.user_id = 'user3' then 1 else null end) as my_likes
count(distinct items_likes.like_id) as total_likes
from t_items left outer join items_likes on t_items.item_id = items_likes.item_id
group by t_items.item_id, items_likes.user_id
having count(case when item_likes.user_id = 'user3' then 1 else null end) > 0;
推荐阅读
- python - 在熊猫中将列与自身进行比较
- mongodb - 在 mongodb 中执行 bulk_write 后报告 writeErrors 的任何正确方法
- swift - 在加载的视图上选择选项卡并更改段
- python - 如何根据另一个单元格的值有条件地填充一个单元格
- algorithm - 算法:一个几何形状可能包含另一个形状
- java - 命令失败,线程异常,arrayindex 越界:1
- neural-network - 有人知道 xavier_normal_ 和 kaiming_normal_ 之间的区别吗?
- javascript - Firebase getIdToken 返回对象
- python-3.x - 出现错误:尝试在 python 中使用 urllib 库为 HTTP 请求响应周期实现简单程序时未定义名称“html”
- git - 个性化 jgitflow maven 插件