2016-04-27 3 views
1

у меня есть 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 разных таблиц. Поэтому мне действительно нужно некоторое представление о ранжировании базы данных в целом - хотя вышеупомянутая проблема - простой способ ее представлять. Каковы некоторые хорошие практики?

+0

Пожалуйста, покажите пример ввода и ожидаемого вывода. – 1000111

+0

вы можете попробовать следующее: 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 как число. –

ответ

2

Я думаю, что сохранить ранг каждого пользователя в другой таблице (используя процедуру при вставке данных в таблицу результатов) было бы лучше. Чтобы вы могли получить звание сразу, когда вам нужно.

Отметьте как правильный ответ в этой ссылке. Это может помочь вам. rank function in sql

Смежные вопросы