Используя MySQL, как мне выбрать ранг результата запроса для одной конкретной строки?

StackOverflow https://stackoverflow.com/questions/1262448

  •  12-09-2019
  •  | 
  •  

Вопрос

Сегодня я потратил довольно много времени, пробуя разные вещи, но, похоже, ни одна из них не работает.Вот моя ситуация, я хотел бы иметь возможность выбирать ранг строки на основе ее идентификатора из специально отсортированной строки

Например, если мой запрос выглядит примерно так:

SELECT id, name FROM people ORDER BY name ASC

с такими результатами, как:

id   name
3    Andrew
1    Bob
5    Joe
4    John
2    Steve

Я хотел бы получить ранг (в какой строке он заканчивается в результатах), не возвращая все строки и не зацикливая их, пока я не доберусь до той, которую я хочу (в PHP).

Например, я хотел бы выбрать "ранг" "Стива", чтобы он возвращал - в данном случае - 5 (не его идентификатор, а "ранг" его имени в приведенном выше запросе).

Аналогично, я хотел бы иметь возможность выбирать ранг любой строки с идентификатором 1.Для этого примера я хотел бы вернуть "ранг", равный 2 (потому что именно в этой строке результата есть идентификатор 1) и ничего больше.

Я погуглил столько, сколько смог, с разными результатами...либо у меня действительно медленные запросы к таблицам большего размера, либо мне приходится создавать всевозможные временные таблицы и пользовательские переменные (первого я бы ДЕЙСТВИТЕЛЬНО хотел избежать, со вторым, я полагаю, я смогу смириться).

Мы были бы очень признательны за любую помощь или понимание.

Это было полезно?

Решение

от хитрое программное обеспечение:

SELECT p1.id, p1.name, COUNT( p2.name ) AS Rank
    FROM people p1
    JOIN people p2 
    ON p1.name < p2.name
    OR (
         p1.name = p2.name
         AND p1.id = p2.id
    )
GROUP BY p1.id, p1.name
ORDER BY p1.name DESC , p1.id DESC
LIMIT 4,1

Другие советы

Что-то вроде этого?

SELECT Row, id, name
FROM (SELECT @row := @row + 1 AS Row, id, name
      FROM people
      ORDER BY name ASC)
WHERE Row = @SomeRowNumber

Если вы хотите использовать идентификатор, просто измените предложениеwhere.

Попробуй это:

SELECT @rownum:=@rownum+1 `rank`, p.id, p.name
FROM people p, (SELECT @rownum:=0) r
ORDER BY name ASC

Я пробую этот код...может помочь другим Я получаю результат от пользователей и загружаю таблицу для изображения профиля пользователя и присоединяюсь к ней после того, как я подсчитываю баллы пользователя и сортирую по ним.Наконец-то я проверяю и добавляю номер строки для ранжирования пользователей...Наслаждайся этим.Спасибо

set @row_num = 0;
set @calp =0;
select  if(@calp=(@calp:=user.cal_points), @row_num, @row_num := @row_num + 1) as row_number,user.* from 
(select user_skills.*,users.username,upload.file_name from user_skills join users on user_skills.user_id=users.id join upload on upload.upload_id=users.profile_pic order by user_skills.cal_points desc) as user
WHERE user.skill_name LIKE  '%ph%'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top