2009-08-11 6 views
1

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

Например, если мой запрос что-то вроде:

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) и ничего больше.

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

Любая помощь или понимание были бы оценены.

ответ

2

из 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 
+0

После нескольких небольших изменений это, похоже, работает довольно хорошо для того, что мне нужно.Однако одно дополнительное усложнение: можно было бы выбрать набор строк с учетом набора условий (например, только люди, у которых есть имя «J» в их имени, - WHERE name LIKE «% j%». Я пробовал это , и хотя поле результата «rank» по-прежнему актуально, оно пропускает числа для тех, у кого нет имени J. – theotherlight

2

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

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

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

+0

Его дает ошибку, что каждый Производная таблица должна иметь свой собственный псевдоним @Brandon –

1

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

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

Это похоже на то, что я уже придумал Googling, и она отлично работает, если я хочу «ранг» каждой строки в пределах мой стол, но что, если я хочу только ранг одной строки? Я пытался что-то вроде

 SELECT @rownum:[email protected]+1 'rank', p.id, p.name FROM people p, (SELECT @rownum:=0) r WHERE id = 5 ORDER BY name ASC 
Но это всегда даст мне звание 1 (потому что только когда-либо возвращает один результат). Есть ли способ получить единственный ранг одной строки на основе всех результатов запроса? Надеюсь, это имеет смысл. – theotherlight

+0

как получить только одну запись с этим определенным рангом, используя ваш запрос @Plutor –

0

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

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