у меня есть users
стола и scores
стола:MySQL - Вычислить ранг из других таблиц
-------- users Name | Type ------------------------|---------------- uuid | VARCHAR(36) name | VARCHAR(255) ... | ...
-------- scores Name | Type ------------------------|---------------- uuid | VARCHAR(36) user_uuid | VARCHAR(36) score | INT(11)
Я могу принести user
, в том числе их общего score
с использованием подзапроса как это:
SELECT user.uuid, user.name,
(SELECT SUM(score) FROM scores WHERE user_uuid = user.uuid) AS score
FROM user WHERE user.uuid = [USER_UUID];
Но теперь, как я могу получить пользователя? То есть, ранг определяется их счетом в сравнении с оценками каждого другого пользователя.
Действительно ли необходимо прокручивать каждый user
, рассчитать все их оценки, а затем заказать их оценки, чтобы определить ранг одного пользователя? Выполнение этого запроса «на лету» кажется налоговым, особенно если у меня есть большое количество пользователей. Должен ли я вместо этого построить отдельную таблицу rankings
и повторно отсортировать таблицу после каждого INSERT в таблице scores
? Это тоже не идеально.
У меня есть еще одно приложение, которое потребует также «на лету», но расчеты гораздо более серьезны: пользовательский score
определяется сложным алгоритмом, охватывающим не менее 5 разных таблиц. Поэтому мне действительно нужно некоторое представление о ранжировании базы данных в целом - хотя вышеупомянутая проблема - простой способ ее представлять. Каковы некоторые хорошие практики?
Пожалуйста, покажите пример ввода и ожидаемого вывода. – 1000111
вы можете попробовать следующее: row_number: = 0; ВЫБОР user_view.user_rank, user_view.uuid, user_view.name (SELECT (row_number: = row_number + 1) в качестве user_rank, user.uuid, user.name, (SELECT SUM (оценка) FROM баллов ГДЕ user_uuid = пользователь. uuid) AS оценка ОТ пользователя, (SELECT @row_number: = 0) AS t заказать по счету) user_view; обязательно определите row_number как число. –