MySQL: запрос таблицы лидеров со связками

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

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-решения для таких вещей 🙂

     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.

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

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

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

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