Я знаю, что это популярная тема, но я до сих пор не нашел то, что искал. Я хотел бы запросить одну таблицу
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). Обязательно учитывайте связи, когда вы это делаете.
И условие края заключается в том, что вы не знаете, связана ли первая строка вашего результирующего набора с людьми, опережающими «его». Поэтому вам нужно знать, сколько людей имеет тот же показатель, что и первый человек в вашем результирующем наборе. (Если вы начинаете сверху, это не проблема).