2015-04-04 5 views
0
CREATE TABLE `players` (
`pid` int(2) NOT NULL AUTO_INCREMENT, 
`name` varchar(50) NOT NULL, 
`team` varchar(20) NOT NULL, 
`age` int(2) NOT NULL, 
PRIMARY KEY (`pid`), 
UNIQUE KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


INSERT INTO `players` (`pid`, `name`, `age`, `team`) VALUES 
(1, 'Samual', 25, 'aa'), 
(2, 'Vino', 20, 'bb'), 
(3, 'John', 20, 'dd'), 
(4, 'Andy', 22, 'cc'), 
(5, 'Brian', 21, 'dd'), 
(6, 'Dew', 24, 'xx'), 
(7, 'Kris', 25, 'qq'), 
(8, 'William', 26, 'cc'), 
(9, 'George', 23, 'nn'), 
(10, 'Peter', 19, 'aa'), 
(11, 'Tom', 20, 'aa'), 
(12, 'Andre', 20, 'aa'); 

В приведенной выше таблице я хочу, чтобы этот запрос извлекал рейтинг игроков в порядке убывания их результатов.PHP рейтинг MYSQL запрос на рейтинг групп

SELECT pid, name, age, team, rank FROM 
(SELECT pid, name, age, team, 
@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank, 
@incRank := @incRank + 1, 
@prevRank := age 
FROM players p, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1 
) r 
ORDER BY age DESC) s WHERE team='aa' 

Это дало мне результат ниже:

Name  |  Age | Rank 
####-------------------------------- 
Samual  |  25  | 2  
Tom   |  20  | 8  
Andre  |  20  | 8  
Peter  |  19  | 12 

Но я хочу, чтобы результаты были возвращены таким образом:

Name  |  Age | Rank 
####-------------------------------- 
Samual  |  25  | 1  
Tom   |  20  | 2  
Andre  |  20  | 2  
Peter  |  19  | 4 

Поэтому, делая запрос, чтобы дать мне знак в пределах определенной группы.

+0

Читателей отвечают на этот вопрос, возможно, первым хотят проверить ранжирование вопросов SQL Ора по: [один] (http://stackoverflow.com/q/ 29388723), [два] (http://stackoverflow.com/q/29391651), [три] (http://stackoverflow.com/q/29451275), [четыре] (http://stackoverflow.com/q/29452337) и [пять] (http://stackoverflow.com/q/29486804), так что работа не случайно дублируется. – halfer

ответ

1

Вам нужно переместить, где положение в запросе в качестве

SELECT pid, 
name, 
age, 
team, 
rank 
FROM (
SELECT pid, name, age, team, 
@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank, 
@incRank := @incRank + 1, 
@prevRank := age 
FROM players p, (SELECT @curRank :=0, @prevRank := NULL, @incRank := 1) r 
WHERE team='aa' 
ORDER BY age DESC 
) s 
+0

Исключительные результаты. :) как вы такой замечательный эксперт по базам данных? любые подсказки для начинающих для освоения sql так быстро? –

+0

Я до сих пор не эксперт, все еще изучаю .. и практика практика и больше практики дает больше знаний :-) –

+0

Хорошо, хотя ваши запросы настолько значимы и полностью основаны на сценах. :) Каковы очень хорошие ресурсы, чтобы иметь эти отличные навыки? –

Смежные вопросы