Используя MySQL, как выбрать ранг результата запроса для одной конкретной строки? - PullRequest
1 голос
/ 11 августа 2009

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

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

SELECT id, name FROM people ORDER BY name ASC

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

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

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

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

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

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

Любая помощь или понимание будет принята с благодарностью.

Ответы [ 4 ]

2 голосов
/ 11 августа 2009

из artfulsoftware :

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
2 голосов
/ 11 августа 2009

Как то так?

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

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

1 голос
/ 11 августа 2009

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

SELECT @rownum:=@rownum+1 `rank`, p.id, p.name
FROM people p, (SELECT @rownum:=0) r
ORDER BY name ASC
0 голосов
/ 07 августа 2014

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

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%'
...