Sql 我如何加入这些表以获得此计数?

Sql 我如何加入这些表以获得此计数?,sql,postgresql,Sql,Postgresql,我有4张桌子: users id int primary key questions id int primary key user_id int references users(id) answers id int primary key question_id references questions(id) user_id references users(id) likes id int primary key answer_id references answers(id) q

我有4张桌子:

users
id int primary key

questions
id int primary key
user_id int references users(id)

answers
id int primary key
question_id references questions(id)
user_id references users(id)

likes
id int primary key
answer_id references answers(id)
question_id references questions(id)
check answer_id xor question_id
like可以引用答案或问题,但不能同时引用两者,因此一个外键将为空

likes表中的user_id是放置like的用户


我如何计算每个用户的问题和答案上的赞数

一种方法使用
union all

select 'questions' as which, count(*)
from questions q join
     likes l
     on l.question_id = q.id
where q.user_id = $user_id
union all
select 'answers' as which, count(*)
from answers a join
     likes l
     on l.answer_id = a.id
where a.user_id = $user_id;
编辑:

如果您希望在一行中显示所有用户的结果,那么关联子查询是一种非常简单的方法:

select u.*,
       (select count(*)
         from questions q join
              likes l
              on l.question_id = q.id
         where q.user_id = u.id
       ) as question_likes,
       (select count(*)
         from answers a join
              likes l
              on l.answer_id = a.id
         where a.user_id = u.id
       ) as answer_likes
from users u;

一种方法使用
union all

select 'questions' as which, count(*)
from questions q join
     likes l
     on l.question_id = q.id
where q.user_id = $user_id
union all
select 'answers' as which, count(*)
from answers a join
     likes l
     on l.answer_id = a.id
where a.user_id = $user_id;
编辑:

如果您希望在一行中显示所有用户的结果,那么关联子查询是一种非常简单的方法:

select u.*,
       (select count(*)
         from questions q join
              likes l
              on l.question_id = q.id
         where q.user_id = u.id
       ) as question_likes,
       (select count(*)
         from answers a join
              likes l
              on l.answer_id = a.id
         where a.user_id = u.id
       ) as answer_likes
from users u;

如果我理解正确,您需要计算每个用户id的喜好,这些喜好是通过回答和问题一起获得的

如果是,那么一种方法是:

select  coalesce(questions.user_id, answers.user_id) as liked_user_id, count(*) 
from likes
left join questions
on likes.question_id = questions.id
left join answers
on likes.answer_id = answers.id
group by liked_user_id

如果我理解正确,您需要计算每个用户id的喜好,这些喜好是通过回答和问题一起获得的

如果是,那么一种方法是:

select  coalesce(questions.user_id, answers.user_id) as liked_user_id, count(*) 
from likes
left join questions
on likes.question_id = questions.id
left join answers
on likes.answer_id = answers.id
group by liked_user_id

你是在寻找问题和答案的组合喜欢,还是每个总数都有一列?组合…….你是在寻找问题和答案的组合喜欢,还是每个总数都有一列?组合…….美丽,但你将用户id作为参数传递,我想要的是每个用户行有一行,其中包含总喜欢数,所以我也需要加入用户。@AhmadAl kheat。这就是编辑后的版本所做的。beauty,但您正在将user_id作为参数传递,我想要的是,每个用户行中有一行包含总喜欢数,所以我也需要加入用户。@AhmadAl kheat。这就是编辑版本所做的。