2012-10-26 83 views
0

我有三個表(更多的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的所有用戶,攜手與用戶表獲取用戶信息,也算有多少人也都在貢獻表

基本上 - 用戶可以與用戶共享列表,並且還邀請了一些用戶的貢獻,但並非所有的共享被允許貢獻,因此單獨的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表還 - 但是,它減少了結果一個,而我希望它爲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' 

在上面的數據同時返回並顯示0我想回到

user_id name how_many  
3   SAM  1 
1   DAN  0 
+0

你確保最後一次查詢的連接語句在第三行是正確的:on ls.event_id = lc.event_id – Farfarak

+0

@ 010001100110 000101110010011010對不起 - 更新問題 - 我很快在鍵入它的同時考慮下一個查詢! –

+0

您的代碼示例在連接條件中不使用can_contribute列。這符合您的要求。 –

回答

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(lc.event_id)算子行。

+0

這就是向他們展示他們兩個,但也表示他們都在計數時,只有一個人應該有1作爲how_many和其他應該是0 –

+0

仍然沒有發生我 - 修正問題與正確的列名和例子數據 –

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 
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