Вот смотрите. Я могу отсортировать табличку, например так:
SELECT * FROM BAProtocols
WHERE StartID = 123
ORDER BY TimeAtFinish
Получится какая-то такая таблица результатов гонки (запрос сильно упрощён, конечно, потому что все остальное — не суть).
Могу отсортировать табличку иначе:
SELECT * FROM BAProtocols
WHERE StartID = 123
ORDER BY Bib
Тогда получится старт-лист, типа такого.
Вчера на «Биатлонтайме» появилась возможность сортировать индивидуальные гонки по колонке Ski time, это типа чистое время. Поскольку в базе я храню только итоговое время, то чистое приходится вычислять как итоговое минус штрафы за промахи минус судейские корректировки:
SELECT
<много всего>,
(
BAProtocols.TimeAtFinish
- IF (BAProtocols.S1Misses > 0, BAProtocols.S1Misses * 60000, 0)
- IF (BAProtocols.S2Misses > 0, BAProtocols.S2Misses * 60000, 0)
- IF (BAProtocols.S3Misses > 0, BAProtocols.S3Misses * 60000, 0)
- IF (BAProtocols.S4Misses > 0, BAProtocols.S4Misses * 60000, 0)
- BAProtocols.Adjustment
) _skitime
FROM BAProtocols
WHERE StartID = 123
ORDER BY _skitime
Предвосхищая вопрос «Нахрена иф?»: потому что я храню −1 в стрельбе, если человек вообще не стрелял (бывает, люди не доезжают до финиша, это нужно отражать в протоколах), а 0 означает «чисто отстрелялся».
Получается такое. Кстати, любопытно посмотреть, какое колоссальное значение в индивидуальной гонке имеет качество стрельбы: например, пятая по чистому времени Мириам Гёсснер, в итоговом протоколе даже не попала в очки и оказалась 53-й. Но сейчас не об этом речь.
Дело в том, что при сортировке по чистому времени можно сказать, что каждый спорсмен «занял какое-то место», то есть имеет какой-то rank (не знаю, как по-русски) именно по этому критерию, например, Магдалена Нойнер — 1-я по чистому времени, а Ольга Зайцева — 10-я. Можно ли как-то заставить базу данных вернуть мне именно эти ранки по интересующим меня колонкам, не сортируя таблицу по ним?
Собственно, сейчас сам нужный эффект вы видите в самой первой колонке, когда сортировка не по ней. Например, когда результаты отсортированы по чистому времени, ранки слева продолжают означать место в итоговом протоколе. Но я это делаю вручную, что муторно, хочется, чтобы база сама считала.
То есть, короче, мне нужно по нескольким колонкам вернуть не только их значения, но и натуральные числа, которые означали бы, какой по счёту была бы эта колонка, если бы я отсортировал по ней. Если в колонке одинаковые значения у нескольких строчек, то их ранки должны быть равными, а ранк следующих должен быть таким, как если бы они про повторы ничего не знали (то есть, 1, 2, 3, 3, 3, 6, 6, 8, 9, 10).
Технические ограничения, если это важно: MySQL, MyISAM. Помогайте, пожалуйста.