2010-01-14 5 views
0

Скажем, у меня есть таблица типа ID, NAME, SCORE. Теперь, как правило, чтобы получить рейтинг команд, я бы выбрал все и заказал. Иногда, хотя я не хочу знать все рейтинги, просто рейтинг одной команды. Если я добавил столбец RANK, есть ли способ MySQL автоматически заполнить эти значения для меня на основе SCORE? (Я считаю, что MS Excel имеет такую ​​возможность)Автоматизация полей MySQL (например, Excel)

, и если да, то как он обрабатывает галстуки?

благодаря

ответ

2

Вы можете вычислить рейтинг, когда вы делаете запрос:

SELECT * FROM (
    SELECT teams.*, @rownum := @rownum + 1 AS rank 
    FROM teams, (SELECT @rownum := 0) T1 
    ORDER BY score DESC) T2 
WHERE id = 1 

Он работает путем инициализации переменной с именем ROWNUM в 0, а затем итерации по строкам в порядке убывания балла. Для каждой команды увеличивается rownum, и команде присваивается ранг, основанный на текущем значении rownum. Внешний выбор применяет предложение where так, что возвращается только одна строка.

Вот улучшенная версия, которая присваивает тот же ранг к командам, которые связаны баллы:

SELECT id, name, teams.score, rank FROM (
    SELECT score, @rownum := @rownum + 1 AS rank 
    FROM (SELECT DISTINCT(score) FROM teams) T1, (SELECT @rownum := 0) T2 
    ORDER BY score DESC) T3 
JOIN teams ON T3.score = teams.score 

Если это не достаточно быстро для вас, а затем использовать триггер вместо этого.

+0

это выглядит действительно круто, но я не понимаю его. могли бы вы объяснить? также, к сожалению, я попробовал запустить его, и это только дает мне команду №1? –

+2

Я добавил некоторые объяснения в ответ. Попробуйте изменить «WHERE id = 1» на что-то другое, если вы хотите других команд. –

0

выглядит, как я ищу триггера MySQL

0

Получить Все команды:

SELECT 
    s1.name, 
    s1.score, 
    COUNT(s2.name) + 1 AS rank 
FROM scores s1 
LEFT OUTER JOIN scores AS s2 ON (s1.score < s2.score) 
GROUP BY s1.name 
ORDER BY COUNT(s2.name) 

Получить One Team ('Кэнакс'):

SELECT 
    s1.name, 
    s1.score, 
    COUNT(s2.name) + 1 AS rank 
FROM scores s1 
LEFT OUTER JOIN scores AS s2 ON (s1.score < s2.score) 
GROUP BY s1.name 
HAVING s1.name = 'The Canucks' 
ORDER BY COUNT(s2.name) 

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

Примечание: оба они предполагают, что данная команда существует только один раз в таблице оценок, чтобы значение ранга было правильным.

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