Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. Подскажите как получить ранг пользователя, есть SQL запрос, который вроде работает, но если у пользователей одинаковый рейтинг, то этот запрос делает всем ранг одинаковый, подскажите как сделать сортировку.. хотя бы по ID, ORDER BY почему то не хочет работать, не могу понять
Неактивен
А покажите структуру таблицы table? и дайте пожалуйста тестовый набор данных и желаемый результат.
Неактивен
deadka написал:
А покажите структуру таблицы table? и дайте пожалуйста тестовый набор данных и желаемый результат.
Скинул дамп, необходимо получить ранг(место) конкретного пользователя, у всех получается 1 место с данным запросом при одинаковых '36' очках в `rating`
Сейчас у всех 1 место 1 место 1 место с одинаковым количеством очков
т.е. нужно 1 место 2 место и 3 место по сортировке `user_id`
Спасибо за ответ
Неактивен
Вот такие есть поля и данные. Как рассчитывается место?
mysql> select * from ips4_rate_hour_data;
+----+---------+--------+-------+-------+------+-------+------+--------+--------+
| id | user_id | rating | chmok | heart | gift | place | star | isMale | reward |
+----+---------+--------+-------+-------+------+-------+------+--------+--------+
| 1 | 19 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL |
| 2 | 36 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL |
| 3 | 12 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL |
+----+---------+--------+-------+-------+------+-------+------+--------+--------+
3 rows in set (0.01 sec)
Неактивен
deadka написал:
Вот такие есть поля и данные. Как рассчитывается место?
mysql> select * from ips4_rate_hour_data;
+----+---------+--------+-------+-------+------+-------+------+--------+--------+
| id | user_id | rating | chmok | heart | gift | place | star | isMale | reward |
+----+---------+--------+-------+-------+------+-------+------+--------+--------+
| 1 | 19 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL |
| 2 | 36 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL |
| 3 | 12 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL |
+----+---------+--------+-------+-------+------+-------+------+--------+--------+
3 rows in set (0.01 sec)
По `rating` и всё
Неактивен
Покажите пожалуйста тот результат, который Вы хотите получить.
Неактивен
deadka написал:
Покажите пожалуйста тот результат, который Вы хотите получить.
Получить место конкретного пользователя даже при равных очках в поле "rating",
т.е. нужно
user_id = 19 - rank 1 rating = 36
user_id = 36 - rank 2 rating = 36
user_id = 12- rank 3 rating = 36
----------------------
сейчас у меня получается
user_id = 19 - rank 1 rating = 36
user_id = 36 - rank 1 rating = 36
user_id = 12- rank 1 rating = 36
Отредактированно марксqfcd (22.07.2020 13:37:04)
Неактивен
А как определить золото, серебро и бронзу у этих трех чемпионов 19, 12 и 36
если они все получили по 36 очков? То есть кто из 19, 12 или 36 получает золото и почему именно он?
Неактивен
deadka написал:
А как определить золото, серебро и бронзу у этих трех чемпионов 19, 12 и 36
если они все получили по 36 очков? То есть кто из 19, 12 или 36 получает золото и почему именно он?
Думаю по ORDER BY user_id DESC, но у меня не получается это
Неактивен
mysql> select * from ips4_rate_hour_data order by rating desc, user_id desc; +----+---------+--------+-------+-------+------+-------+------+--------+--------+ | id | user_id | rating | chmok | heart | gift | place | star | isMale | reward | +----+---------+--------+-------+-------+------+-------+------+--------+--------+ | 2 | 36 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL | | 1 | 19 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL | | 3 | 12 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL | +----+---------+--------+-------+-------+------+-------+------+--------+--------+ 3 rows in set (0.00 sec)
Оно?
Неактивен
deadka написал:
Код:
mysql> select * from ips4_rate_hour_data order by rating desc, user_id desc; +----+---------+--------+-------+-------+------+-------+------+--------+--------+ | id | user_id | rating | chmok | heart | gift | place | star | isMale | reward | +----+---------+--------+-------+-------+------+-------+------+--------+--------+ | 2 | 36 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL | | 1 | 19 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL | | 3 | 12 | 36 | 0 | 0 | 0 | 0 | 0 | 1 | NULL | +----+---------+--------+-------+-------+------+-------+------+--------+--------+ 3 rows in set (0.00 sec)Оно?
Мне нужно зайти в конкретный профиль и получить его место LIMIT 1, а не делать полную выборку
Неактивен
mysql> select rating from ips4_rate_hour_data order by rating desc, user_id desc limit 1; +--------+ | rating | +--------+ | 36 | +--------+ 1 row in set (0.00 sec)
Неактивен
Отредактированно марксqfcd (22.07.2020 14:47:43)
Неактивен
mysql> SELECT @rownum:=(@rownum+1) AS num, user_id,rating from (SELECT @rownum:=0) AS initialization,ips4_rate_hour_data order by rating desc, user_id desc; +------+---------+--------+ | num | user_id | rating | +------+---------+--------+ | 1 | 36 | 36 | | 2 | 19 | 36 | | 3 | 12 | 36 | +------+---------+--------+ 3 rows in set (0.00 sec)
Нумеруем пользователей, сортируем при этом по rating по убыванию и по user_id также по убыванию. Оно?
Неактивен
deadka написал:
Код:
mysql> SELECT @rownum:=(@rownum+1) AS num, user_id,rating from (SELECT @rownum:=0) AS initialization,ips4_rate_hour_data order by rating desc, user_id desc; +------+---------+--------+ | num | user_id | rating | +------+---------+--------+ | 1 | 36 | 36 | | 2 | 19 | 36 | | 3 | 12 | 36 | +------+---------+--------+ 3 rows in set (0.00 sec)Нумеруем пользователей, сортируем при этом по rating по убыванию и по user_id также по убыванию. Оно?
Нет, просто заходим к юзеру в профиль и выводим его ранг(место позицию в топе), нужно получить его ранг. Это общая выборка юзеров, а мне нужно получить конкретный ранг конкретного юзера из общей таблицы
mysql> SELECT @rownum:@rownum+1) AS num, user_id,rating from (SELECT @rownum:=0) AS initialization,ips4_rate_hour_data WHERE user_id = 19 order by rating desc, user_id desc;
+------+---------+--------+
| num | user_id | rating |
+------+---------+--------+
| 2 | 19 | 36 | ---- ранг 2 должен быть
+------+---------+--------+
3 rows in set (0.00 sec)
Отредактированно марксqfcd (22.07.2020 16:21:56)
Неактивен
select rating from ips4_rate_hour_data where user_id = 19;
)
и далее уже более простым вариантом (36 подставляете из результата предыдущего запроса, это rating пользователя с user_id = 19)
mysql> select 1 + count(*) from ips4_rate_hour_data where (rating > 36) or (rating = 36 and user_id > 19);
+--------------+
| 1 + count(*) |
+--------------+
| 2 |
+--------------+
1 row in set (0.00 sec)
Неактивен
deadka написал:
select 1 + count(*) from ips4_rate_hour_data where (rating > (select rating from ips4_rate_hour_data where user_id = 19)) or (rating = (select rating from ips4_rate_hour_data where user_id = 19) and user_id > 19);
Так можно получить именно место.
А лучше в два запроса - сперва получить rating пользователя с user_id = 19,
(Код:
select rating from ips4_rate_hour_data where user_id = 19;)
и далее уже более простым вариантом (36 подставляете из результата предыдущего запроса, это rating пользователя с user_id = 19)
mysql> select 1 + count(*) from ips4_rate_hour_data where (rating > 36) or (rating = 36 and user_id > 19);
+--------------+
| 1 + count(*) |
+--------------+
| 2 |
+--------------+
1 row in set (0.00 sec)
Спасибо большое
Неактивен