MySQL语句查询排名
思路:
先将数据查询出来,按需要排序的字段做好升序(ASC)、降序(DESC),设置好排序的变量:
1、将已经排好的数据从第一条依次取出来,每取一个数据,排序变量就增加1,直至排序完成:
(1,2,3,4,5…);
2、当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加1:
(1,2,2,3,4…);
3、当出现相同数据时,排名保持不变,但保持不变的数据仍会占用一个排名位置:
(1,1,3,4,5…)。
数据准备:
数据表格式:
CREATE TABLE sql_sort(
area_id VARCHAR(10),
num int
);
表内数据:
INSERT INTO
sql_sort
VALUES
('a',1),
('b',1),
('c',1),
('d',2),
('e',8),
('f',12),
('g',13),
('h',13),
('i',16),
('j',18);
初表查询
SELECT
*
FROM
sql_sort
GROUP BY
area_id
ORDER BY
num;
思路1:
不论数据是否相同,始终依次排序。
(1,2,3,4,5,6,7…)
SELECT
area_id,
num,
@rownum := @rownum + 1 AS num_tmp
FROM
sql_sort,
(SELECT @rownum := 0) r
GROUP BY
area_id;
执行结果如图:
思路2:
只要数据有相同的排名就一样,排名依次排序。
(1,1,2,3,4,4,5…)
SELECT
area_id,
num,
CASE
WHEN @rowtotal = num THEN @rownum
WHEN @rowtotal := num THEN @rownum := @rownum + 1
WHEN @rowtotal := 0 THEN @rownum := @rownum +1
END AS rownum
FROM
sql_sort,
(SELECT @rownum := 0 ,@rowtotal := NULL) r
GROUP BY
area_id;
执行结果如图:
思路3:
只要数据有相同的排名就一样,但是相同排名也占位,排名依次排序。
(1,1,3,4,5,5,7…)
SELECT
area_id,
num,
@rownum := @rownum + 1 AS num_tmp,
@incrnum := CASE
WHEN @rowtotal = num THEN @incrnum
WHEN @rowtotal := num THEN @rownum
END rownum
FROM
sql_sort,
(SELECT @rownum := 0 ,@rowtotal := NULL ,@incrnum := 0) r
GROUP BY
area_id;
执行结果如图: