|
|
|
| Здравствуйте скажите пожалуйста как узнать место (номер) позиции в каком-либо рейтинге при определенной сортировке?
Тут перерыл поиск в форуме нашел код Trianon'a
И написал по его принципу вот так
SELECT count(*) FROM bank WHERE bank_sum > (SELECT bank_sum FROM bank WHERE bank_user='USER');
|
все вроде бы нормально но проблема в том, что bank_sum не уникальное число.
Поэтому когда в базе несколько человек с числом 10 к примеру, то показывается одинаково для всех
Подскажите как можно узнать место в рейтинге, может каким-то иным кодом или доработать этот? | |
|
|
|
|
|
|
|
для: Max_Ivanov
(07.12.2009 в 22:31)
| | > Поэтому когда в базе несколько человек с числом 10 к примеру, то показывается одинаково для всех
Так непонятно — тебе нужно так, чтобы с одним и тем же значением bank_sum разделяли место в рейтинге или нет? | |
|
|
|
|
|
|
|
для: Fractured#
(07.12.2009 в 22:43)
| | когда сумма одинаковая, там все равно как-то сортируется, и какое-то имя идет ниже или выше другого, вот нужно это учитывать, а как я не знаю | |
|
|
|
|
|
|
|
для: Max_Ivanov
(07.12.2009 в 23:01)
| | Как-то так, возможно
SELECT COUNT(*) + 1 FROM
(
SELECT 1 FROM `bank` WHERE `bank_sum` > ( SELECT `bank_sum` FROM `bank` WHERE `bank_user` = 'USER' ) GROUP BY `bank_sum`
) AS `tmp`;
|
| |
|
|
|
|
|
|
|
для: Max_Ivanov
(07.12.2009 в 23:01)
| | >когда сумма одинаковая, там все равно как-то сортируется,
там - это где? | |
|
|
|
|
|
|
|
для: Trianon
(07.12.2009 в 23:30)
| |
SELECT * FROM bank ORDER BY bank_sum DESC;
|
Те у кого число 10 как-то упорядочены, то есть идут по порядку, не в одном же значении выводятся те у кого сумма 10 | |
|
|
|
|
|
|
|
для: Max_Ivanov
(07.12.2009 в 23:36)
| | но это не ранк.
и если bank_sum неуникален - этот запрос имеет право выдавать отличающиеся результаты.
В том-то и дело, что в пределах совпадающего bank_sumстроки не сортируются никак.
Т.е. выводятся неотсортированными. | |
|
|
|
|
|
|
|
для: Trianon
(07.12.2009 в 23:42)
| | то есть никак не получится узнать? | |
|
|
|
|
|
|
|
для: Max_Ivanov
(08.12.2009 в 00:27)
| | Ну как же объяснить-то, чтоб дошло...
Представьте себе, что у Вас в табличке две строки Вася и Петя. И у обоих по 10 очков. А первому приз назначен
И Вы выводите её так:
Ранг Имя Очки
1 Вася 10
2 Петя 10
|
А потом приходит Петя и говорит: Макс, а чо это ты меня на второе место поставил?
И начинает так реально бить за это морду. Потому что ведь несправедливо, а?
Вам, однако, становится страшно. И Вы переделываете вывод вот так:
Ранг Имя Очки
1 Петя 10
2 Вася 10
|
Но тут приходит Вася. И лупит в морду уже без разговоров.
Потому что ведь мало того что несправедливо, так еще человек над ошибками не работает, а?
И тут Вы конечно же...
То есть я надеюсь, что конечно...
Как? | |
|
|
|
|
|
|
|
для: Trianon
(08.12.2009 в 00:49)
| | Это понятно, а если выборка будет с сортировкой по двум полям
SELECT * FROM bank ORDER BY bank_sum DESC, bank_id ASC;
в данном случае можно ли узнать рейтинг ?
Я пытаюсь вставить но внутренний запрос никак не реагирует на сортировки
SELECT count(*) FROM bank WHERE bank_sum > (SELECT bank_sum FROM bank WHERE bank_user='USER' ORDER BY bank_sum DESC, bank_id ASC);
|
если копать в этом направлении безнадежно подскажите тогда как это сделать? | |
|
|
|
|
|
|
|
для: Max_Ivanov
(08.12.2009 в 03:01)
| | Вы видите, что пишете?
Получить количество строк, в которых значение поля bank_sum превышает
значение поля bank_sum остальных строк, отсортированных в определенном порядке.
Какая разница, в каком порядке сортировать строки для сравнения этих полей?
Число строк превышения bank_sum от порядка сортировки изменится чтоли?
Вводите рейтинговую функцию вроде bank_sum*1000000000.0+bank_id
По ней и определяйтесь.
Смысл такого рейтинга, правда, может спровоцировать воздействие на лицо... но об этом я уже предупредил. | |
|
|
|