SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.07.2020 12:21:48

марксqfcd
Участник
Зарегистрирован: 22.07.2020
Сообщений: 9

Ранг конкретного пользователя

Здравствуйте. Подскажите как получить ранг пользователя, есть SQL запрос, который вроде работает, но если у пользователей одинаковый рейтинг, то этот запрос делает всем ранг одинаковый, подскажите как сделать сортировку..  хотя бы по ID, ORDER BY почему то не хочет работать, не могу понять

SELECT rating, FIND_IN_SET( rating, ( SELECT GROUP_CONCAT( rating ORDER BY rating DESC )  FROM table ) ) AS rank FROM  table WHERE user_id = 12 ORDER BY `rating` DESC LIMIT 1

Неактивен

 

#2 22.07.2020 13:00:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2305

Re: Ранг конкретного пользователя

А покажите структуру таблицы table? и дайте пожалуйста тестовый набор данных и желаемый результат.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 22.07.2020 13:07:40

марксqfcd
Участник
Зарегистрирован: 22.07.2020
Сообщений: 9

Re: Ранг конкретного пользователя

deadka написал:

А покажите структуру таблицы table? и дайте пожалуйста тестовый набор данных и желаемый результат.

Скинул дамп, необходимо получить ранг(место) конкретного пользователя, у всех получается 1 место с данным запросом при одинаковых '36' очках в `rating`
Сейчас у всех 1 место 1 место 1 место с одинаковым количеством очков
т.е.  нужно 1 место 2 место и 3 место по сортировке `user_id`

Спасибо за ответ


Прикрепленные файлы:
Attachment Icon ips4_rate_hour_data.sql, Размер: 2,189 байт, Скачано: 16

Неактивен

 

#4 22.07.2020 13:20:50

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2305

Re: Ранг конкретного пользователя

Вот такие есть поля и данные. Как рассчитывается место?

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)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 22.07.2020 13:22:02

марксqfcd
Участник
Зарегистрирован: 22.07.2020
Сообщений: 9

Re: Ранг конкретного пользователя

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` и всё

Неактивен

 

#6 22.07.2020 13:29:29

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2305

Re: Ранг конкретного пользователя

Покажите пожалуйста тот результат, который Вы хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 22.07.2020 13:32:35

марксqfcd
Участник
Зарегистрирован: 22.07.2020
Сообщений: 9

Re: Ранг конкретного пользователя

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)

Неактивен

 

#8 22.07.2020 13:39:09

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2305

Re: Ранг конкретного пользователя

А как определить золото, серебро и бронзу у этих трех чемпионов 19, 12 и 36
если они все получили по 36 очков? То есть кто из 19, 12 или 36 получает золото и почему именно он?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 22.07.2020 13:41:03

марксqfcd
Участник
Зарегистрирован: 22.07.2020
Сообщений: 9

Re: Ранг конкретного пользователя

deadka написал:

А как определить золото, серебро и бронзу у этих трех чемпионов 19, 12 и 36
если они все получили по 36 очков? То есть кто из 19, 12 или 36 получает золото и почему именно он?

Думаю по ORDER BY user_id DESC, но у меня не получается это

Неактивен

 

#10 22.07.2020 14:06:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2305

Re: Ранг конкретного пользователя

Код:

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)

Оно?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 22.07.2020 14:15:34

марксqfcd
Участник
Зарегистрирован: 22.07.2020
Сообщений: 9

Re: Ранг конкретного пользователя

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, а не делать полную выборку

Неактивен

 

#12 22.07.2020 14:27:55

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2305

Re: Ранг конкретного пользователя

Код:

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)

Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#13 22.07.2020 14:47:22

марксqfcd
Участник
Зарегистрирован: 22.07.2020
Сообщений: 9

Re: Ранг конкретного пользователя

SELECT user_id, rating, FIND_IN_SET( rating, (  SELECT GROUP_CONCAT( rating ORDER BY rating DESC ) FROM ips4_rate_hour_data ) ) AS rank FROM ips4_rate_hour_data WHERE user_id =  '12'

rank получается 1 (нужен 1)

SELECT user_id, rating, FIND_IN_SET( rating, (  SELECT GROUP_CONCAT( rating ORDER BY rating DESC ) FROM ips4_rate_hour_data ) ) AS rank FROM ips4_rate_hour_data WHERE user_id =  '19'

rank получается 1  (нужен 2)

SELECT user_id, rating, FIND_IN_SET( rating, (  SELECT GROUP_CONCAT( rating ORDER BY rating DESC ) FROM ips4_rate_hour_data ) ) AS rank FROM ips4_rate_hour_data WHERE user_id =  '36'

rank получается 1 (нужен 3)

Подскажите как это сделать

Отредактированно марксqfcd (22.07.2020 14:47:43)

Неактивен

 

#14 22.07.2020 16:02:47

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2305

Re: Ранг конкретного пользователя

Код:

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 также по убыванию. Оно?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#15 22.07.2020 16:20:46

марксqfcd
Участник
Зарегистрирован: 22.07.2020
Сообщений: 9

Re: Ранг конкретного пользователя

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:sad@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)

Неактивен

 

#16 23.07.2020 11:14:46

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2305

Re: Ранг конкретного пользователя

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)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#17 23.07.2020 20:07:35

марксqfcd
Участник
Зарегистрирован: 22.07.2020
Сообщений: 9

Re: Ранг конкретного пользователя

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)

Спасибо большое

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson