mysql查詢所有分類前三的資料
阿新 • • 發佈:2018-12-11
設計思路
當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 |