2010-08-17 62 views
3

我試圖找出如何讓高層用戶在每個類別與一個MySQL查詢: 我的用戶表看起來是這樣的:頂級用戶SQL查詢與類別?

USER_ID,CATEGORY_ID ......以及一些其他的東西

我投票表看起來像這樣(每行是一個正票): reciever_id ......以及一些其他的東西

我在想,我需要通過USER_ID首先確定這樣獨特的投票:

reciever_id, votes 
1 2 
2 6 

然後,我可以下令由投票數量... 然後從用戶users.whatever,不同的(CATEGORY_ID),(即查詢)WHERE users_id = that_queries_user.id

反正我可能是明顯真的很困惑如何編寫這個查詢和任何幫助將不勝感激。

回答

2

這將回報你前10名用戶:

SELECT u.*, 
     (
     SELECT COUNT(*) 
     FROM votes v 
     WHERE v.receiver_id = u.user_id 
     ) AS score 
FROM users u 
ORDER BY 
     score DESC 
LIMIT 10 

這將從每個類別返回一個頂級用戶:

SELECT u.* 
FROM (
     SELECT DISTINCT category_id 
     FROM users 
     ) uo 
JOIN users u 
ON  u.user_id = 
     (
     SELECT user_id 
     FROM users ui 
     WHERE ui.category_id = uo.category_id 
     ORDER BY 
       (
       SELECT COUNT(*) 
       FROM votes v 
       WHERE v.receiver_id = ui.user_id 
       ) DESC 
     LIMIT 1 
     ) 
+0

這個底部有一個是最接近的,但不返回唯一的用戶ID和類別ID ... – Travis 2010-08-17 13:35:54

+0

@Travis:它會從用戶表返回的一切,包括用戶ID和類別ID的。如果您只想要這些,請將'u。*'替換爲您想要的字段。 – Quassnoi 2010-08-17 13:37:38

+0

不,我知道,它在相同的類別中強烈地返回兩個用戶... – Travis 2010-08-17 13:40:52

0

試試這個(如果真像你說的,每一行是一個正票):

Select User_id, category_id, Count(*) voteCnt 
    From Users u Join Votes v 
    On v.receiver_id = u.user_id 
    Group By User_id, category_id 
    Having Count(*) > [Whayever Threshold you want] 
    Order By Count(*) Desc 

或者這一點,如果票數列實際上是選票的計數:

Select User_id, category_id, Sum(votes) voteSum 
    From Users u Join Votes v 
    On v.receiver_id = u.user_id 
    Group By User_id, category_id 
    Having Sum(votes) > [Whayever Threshold you want] 
    Order By Sum(votes) Desc