1. 程式人生 > >mysql查詢所有分類前三的資料

mysql查詢所有分類前三的資料

設計思路

當mysql查詢有很多分類時,可能只需要每種分類的前三或者前十的資料,不需要返回所有的結果,所以我們可以給不同種類的資料新增序號,然後通過序號來篩選結果

例:建一張工人工作質量表,用年份和質量來分類

CREATE TABLE `work` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT '' COMMENT '姓名',
  `years` int(11) DEFAULT 0 COMMENT '年份',
  `type` varchar(32) DEFAULT '' COMMENT '質量型別: 高 中 低 不合格',
  `count` int(11) DEFAULT 0 COMMENT '工作量',
  PRIMARY KEY (`id`),
  UNIQUE KEY(`name`,`years`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

給新建的表新增一些資料

INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('張三', '高', 2020, 0);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('張三', '中', 2020, 200);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('張三', '低', 2020, 200);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('張三', '不合格', 2020, 600);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('李四', '高', 2020, 800);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('李四', '中', 2020, 100);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('李四', '低', 2020, 50);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('李四', '不合格', 2020, 50);
INSERT INTO `work` ( `name`, `type`, `years`, `count`) VALUES( '李四', '高', 2018, 100);
INSERT INTO `work` ( `name`, `type`, `years`, `count`) VALUES( '李四', '中', 2018, 200);
INSERT INTO `work` ( `name`, `type`, `years`, `count`) VALUES( '李四', '低', 2018, 500);
INSERT INTO `work` ( `name`, `type`, `years`, `count`) VALUES( '李四', '不合格', 2018, 200);

查詢每人每年工作數量前3的資料

1.直接查詢

SELECT name,type,years,count FROM work ORDER BY name DESC,years DESC,count DESC

查詢的結果發現有很多是不需要的

name type years count
李四 2020 800
李四 2020 100
李四 2020 50
李四 不合格 2020 50
李四 2018 500
李四 2018 200
李四 不合格 2018 200
李四 2018 100
張三 不合格 2020 600
張三 2020 200
張三 2020 200
張三 2020 0

2.新增序號篩選查詢(通過數值排序新增序號,再將序號大於3的去除)

SELECT name, type, years, count
FROM (
SELECT CASE
WHEN @name = name
AND @years = years THEN @ordinal := @ordinal + 1
ELSE @ordinal := 1
END AS ordinal, @name := name AS name, @years := years AS years
, type, count
FROM (
SELECT name, type, years, count
FROM work, (
SELECT @ordinal := 0, @name := ‘’
, @years := 0
) t1
ORDER BY name DESC, years DESC, count DESC
) t2
) t3
WHERE ordinal <= 3

查詢的結果

name type years count
李四 2020 800
李四 2020 100
李四 2020 50
李四 2018 500
李四 2018 200
李四 不合格 2018 200
張三 不合格 2020 600
張三 2020 200
張三 2020 200