Я потратил довольно много времени на то, чтобы пробовать разные вещи, но никто из них, похоже, не работает. Вот моя ситуация, я хотел бы иметь возможность выбрать ранг строки на основе его идентификатора из специально отсортированной строки
Например, если мой запрос выглядит примерно так:
SELECT id, name FROM people ORDER BY name ASC
с результатами, такими как:
id name 3 Андрей 1 Боб 5 Джо 4 Иоанн 2 Стив
Я хотел бы получить ранг (какая строка в результатах), не возвращая все строки и не зацикливая их, пока я не получу тот, который я хочу (в PHP).
Например, я хотел бы выбрать «ранг» «Стива», чтобы он возвращался – в этом случае – 5 (не его идентификатор, а «ранг» его имени в вышеупомянутом запросе).
Аналогично, я хотел бы иметь возможность выбрать ранг любой строки с идентификатором 1. Для этого примера я хотел бы вернуть «ранг» из 2 (потому что это в какой строке результата есть идентификатор 1) и ничего больше.
У меня есть Google, насколько я мог бы с разными результатами … либо иметь очень медленные запросы для больших таблиц, либо создавать всевозможные временные таблицы и пользовательские переменные (первый из которых я ДЕЙСТВИТЕЛЬНО хотел бы избежать, последний Полагаю, я могу жить).
Любая помощь или понимание будут оценены.
от 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
Что-то вроде этого?
SELECT Row, id, name FROM (SELECT @row := @row + 1 AS Row, id, name FROM people ORDER BY name ASC) WHERE Row = @SomeRowNumber
Если вы хотите пойти по ID, просто измените предложение 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%'