0

我有三张表(更多的列,但列出了重要的列):

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 表中——但是,它将结果减少到一个,而我希望它返回两个结果,如果不是,则显示 0 表示 how_many在 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
4

3 回答 3

1

如果我说得对 - 这就是你需要的

SQL 小提琴示例

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
于 2012-10-26T14:19:44.847 回答
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 有一个垃圾扩展,它试图删除要求但经常提供不正确的数据

编辑,评论后。

您仍然应该使用正确的 GROUP BY 语法

但是,您的 COUNT 应该是COUNT(lc.event_id)计算子行。

于 2012-10-26T13:27:35.157 回答
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
于 2012-10-26T14:05:30.263 回答