加入查询返回空也是如此

时间:2012-10-26 13:24:44

标签: mysql sql

我有三张桌子(更多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

3 个答案:

答案 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)

如果我找对你 - 这就是你需要的东西

SQL Fiddle Example

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