2009-02-06 76 views
4

我知道這是一個容易的問題,但是這使我發瘋......通過總投稿來選擇用戶

我有一個用戶表,評論表和圖片表。

我想根據提交(他們的評論和他們提交的照片的總數)前10位用戶的列表。

就是這樣。

讓我感到羞恥。


更新:基於埃德的答案。

這裏是我的設置:

  • 用戶表(user_ID的,用戶名)
  • 圖像表(img_id,submittedby_id = users.user_id)
  • 意見表(ID,submittedby_id = users.user_id)

,並最終查詢:

select submittedby_id, sum(total) 
from 
    (select submittedby_id, count(img_id) as total from  
      images group by submittedby_id 
    union 
    select submittedby_id, count(id) as total from 
      comments group by submittedby_id 
    ) as x 
group by submittedby_id 
order by sum(total) desc limit 10; 

回答

5

也許有點像這樣:

select username, sum(submissions) 
from 
    (select username, count(picture_id) from  
      pictures group by username 
    union 
    select username, count(comment_id) from 
      comments group by username 
    ) 
group by username 
order by sum(submissions) desc limit 10; 

從概念上概述:

  1. 計數的用戶提交的材料每個表
  2. 聯合這些,所以每個用戶將有0到2個子查詢計數。
  3. 再次分組一次,合計兩個計數,然後進行排序,以便最高金額位居前列。

希望這會有所幫助。

2

僞代碼,當然,但你想是這樣的:

select 
    u.userid 
, count(commentID) + count(photoID) as totalsubmissions 
from users u 
left outer 
    join comments c 
    on u.userid = c.userid 
left outer 
    join pictures p 
    on u.userid = p.userid 
group by 
    u.userid 
order by 2 desc 
fetch first 10 rows only 
+0

由於評論和圖片之間存在笛卡爾積,因此「總計提交次數」將會錯誤。不過,如果僅僅需要對頂級用戶進行排序,這可能還行。 – 2009-02-06 02:06:12

+0

總是關閉......任何方法來糾正? – jmccartie 2009-02-06 02:12:15

0

扭捏埃德的答案:

select submittedby_id, sum(submissions) 
from 
    (select submittedby_id, count(img_id) as submissions from  
      images group by submittedby_id 
    union all 
    select submittedby_id, count(id) as submissions from 
      comments group by submittedby_id 
    ) as x 
group by submittedby_id 
order by sum(submissions) desc limit 10 

我相信你想做一個工會都在這裏,只是工會可以省略看起來相同(相同的ID和提交數)的記錄。