MySQL: запрос списка лидеров со связями - PullRequest
4 голосов
/ 16 августа 2011

Я знаю, что это популярная тема, но я до сих пор не нашел именно то, что искал. Я хотел бы запросить одну таблицу

BOOKS_READ
id
user_id
book_id

для форматирования списка лидеров, которые указали большинство прочитанных книг. Когда пользователь читает книгу, запись, соответствующая идентификатору книги и идентификатору пользователя, регистрируется в таблице books_read.

Можно ли ранжировать результаты этого запроса, начиная с 1 и с учетом связей?

SELECT user_id, COUNT(*) AS book_count 
FROM books_read 
GROUP BY user_id 
ORDER BY book_count DESC LIMIT 10

В случае ничьей, я хотел бы перечислить знак '=' в результатах.

Например,

rank  user_id  book_count  
=1    30       121
=1    17       121
 2    101      119
=3    11       104
=3    91       104

Большое спасибо за любую помощь! Я не возражаю против использования PHP для решения некоторых из них, но мне очень интересно изучать прямые SQL-решения для таких вещей: -)

Ответы [ 2 ]

2 голосов
/ 16 августа 2011
SELECT GROUP_CONCAT(user_id, book_count
FROM (
    SELECT user_id, COUNT(*) AS book_count 
    FROM books_read 
    GROUP BY user_id 
    ORDER BY book_count DESC
) AS T1
GROUP BY book_count
ORDER BY book_count

Даю вам

user_id  book_count  
30,17       121
101         119
11,91       104

Что вы можете затем использовать PHP для анализа связей.

<?php
$rank = 1;

while ($row = mysql_fetch_assoc($result)) {
    $users = explode(',', $row['user_id'];
    foreach ($users as $user) {
        echo 'Rank: ' . $rank . ' ' . $user . "\n;
    }
    $rank++;
}

?>
1 голос
/ 16 августа 2011

То, что вы хотите сделать, - это подсчитать количество людей, которые набрали лучший результат, чем интересующая вас запись, и добавить 1.

Итак, если вы лучший игрок, ноль человекиметь лучший результат, поэтому 0 + 1 = # 1 рейтинг.

Если пять человек имеют лучший результат, независимо от того, сколько из них связаны друг с другом, вы все равно 5 + 1 = 6.

Проблема в том, что это довольно дорогой запрос для каждой отображаемой строки.Таким образом, вы, вероятно, захотите сделать это для первой строки в вашем наборе результатов, а затем добавить одну для всех после этого на своем уровне представления (PHP).Обязательно принимайте во внимание связи при этом.

И главное условие - вы не знаете, связан ли первый ряд в вашем наборе результатов с людьми, стоящими перед «ним».Таким образом, вам нужно знать, сколько людей имеют тот же результат, что и первый человек в вашем наборе результатов.(Если вы начинаете сверху, это не проблема.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...