0

私は3つのテーブルを持っています(さらに多くの列がありますが、重要なものをリストしています):

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'

これにより、正しい2つの結果が表示されます-次のクエリは、これら2つのうちどちらがlist_contributeテーブルにあるかを見つけようとしていますが、結果を1つに減らしますが、両方を返し、そうでない場合はhow_manyに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
4

3 に答える 3

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には、要件を削除しようとするが、誤ったデータを頻繁に提供するごみ拡張機能があります

コメント後に編集します。

引き続き正しいGROUPBY構文を使用する必要があります

ただし、COUNTは子行COUNT(lc.event_id)をカウントする必要があります。

于 2012-10-26T13:27:35.157 に答える
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

目的の結果セットが返されない場合は、以下のクエリを使用してください。これは、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 に答える