2010-08-17 2 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

Это дно один ближайший, но не возвращает уникальный идентификатор пользователя и категория Идентификаторы ... – Travis

+0

@Travis: он возвращает все из таблицы пользователя, включая идентификатор пользователя и категорию идентификаторов. Если вы хотите только это, замените 'u. *' Полями, которые вы хотите. – Quassnoi

+0

Нет, я знаю это, он acutally возвращает двух пользователей в той же категории ... – Travis

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 
Смежные вопросы