我有三张桌子(更多cols,但列出了重要的牌):
users
user_id - name
1 DAN
2 TED
3 SAM
list_shares
list_shares_id - user_id - list_id
1 1 123
2 3 123
3 2 456
list_contribute
list_contr_id - list_id - can_contribute
1 123 3
我想在list_id下显示表list_shares中的所有用户,将其与users表连接以获取用户信息,并计算其中有多少用户也在贡献表中
基本上 - 用户可以与用户共享列表并邀请一些用户参与,但并非所有共享都可以贡献,因此单独的list_contribute表。
这是我首先使用的,它只显示具有特定ID的所有用户:
select u.name, u.live_prof_pic, u.url, u.user_id from list_shares ls
join users u on ls.user_id = u.user_id
where ls.list_id = '123'
这会产生两个结果,这是正确的 - 下一个查询试图找到这两个中的哪一个也在list_contribute表中 - 但是,它将结果减少为1而我希望它返回两者并显示0表示如果不在list_contribute
中则如何select u.name, u.live_prof_pic, u.url, count(ls.list_shares_id) as how_many, u.user_id from list_shares ls
join users u on ls.user_id = u.user_id
left join list_contribute lc on ls.list_id = lc.list_id
where ls.list_id = '123'
在上面的数据中我想返回
user_id name how_many
3 SAM 1
1 DAN 0
答案 0 :(得分:1)
添加GROUP BY以使其成为标准SQL聚合
select u.name, u.live_prof_pic, u.url, count(ls.list_shares_id) as how_many, u.user_id
from
list_shares ls
join users u on ls.user_id = u.user_id
left join list_contribute lc on ls.event_id = lc.event_id
where ls.list_id = '123'
group by u.name, u.live_prof_pic, u.url, u.user_id
MySQL有一个rubbish扩展程序,试图删除该要求但经常提供不正确的数据
评论后编辑。
您仍应使用正确的GROUP BY语法
但是,您的COUNT应为COUNT(lc.event_id)
以计算子行数。
答案 1 :(得分:1)
如果它没有返回所需的结果集,请使用下面的查询,这意味着您在list_shares中没有相应用户的孤立记录集。
select
u.name
, u.user_id
, count(lc.list_id) as how_many
from
list_shares ls
INNER JOIN
users u
on
ls.user_id = u.user_id
left join
list_contribute lc
on
ls.list_id = lc.list_id
where
ls.list_id = '123'
GROUP BY
u.name
, u.user_id
不确定mysql计数是如何工作的,所以要100%确定:
select
u.name
, u.user_id
, SUM(CASE WHEN lc.list_id IS NOT NULL THEN 1 ELSE 0 END CASE) as how_many
from
list_shares ls
INNER JOIN
users u
on
ls.user_id = u.user_id
left join
list_contribute lc
on
ls.list_id = lc.list_id
where
ls.list_id = '123'
GROUP BY
u.name
, u.user_id
答案 2 :(得分:1)
如果我找对你 - 这就是你需要的东西
select
u.user_id, u.name,
count(case when lc.can_contribute = u.user_id then 1 else null end) as HowMany
from users as u
inner join list_shares as ls on ls.user_id = u.user_id
inner join list_contribute as lc on lc.list_id = ls.list_id
group by
u.user_id, u.name