MySQLは、グループ化後にフィールドの最大値と最新データを取得するためにgourpbyを使用します
1.事業内容
日常の開発では、テーブルをグループ化し、最大値と最新の値を取得するなど、誰もが必然的にビジネス要件に直面します。これには、groupby関数とmax関数が含まれます。例えば:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(36) DEFAULT NULL,
`subject` varchar(36) DEFAULT NULL,
`score` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('1', '张三', '语文', '92');
INSERT INTO `score` VALUES ('2', '张三', '数学', '100');
INSERT INTO `score` VALUES ('3', '李四', '语文', '95');
INSERT INTO `score` VALUES ('4', '李四', '数学', '75');
INSERT INTO `score` VALUES ('5', '王五', '语文', '85');
INSERT INTO `score` VALUES ('6', '王五', '数学', '96');
INSERT INTO `score` VALUES ('7', '张三', '英语', '99');
INSERT INTO `score` VALUES ('8', '李四', '英语', '76');
INSERT INTO `score` VALUES ('9', '王五', '英语', '99');
ここにビジネスがあります:単一の主題でみんなの最高のスコアを取り出してください。
第二に、問題が再発する
SQLについて最初に考えたのは次のとおりです。
select name,subject,max(score) from score group by name
操作の結果は次のとおり
です。名前とスコアが正しいことがわかりますが、主題はすべて中国語です。明らかに現実と矛盾しています!(Group byは、デフォルトで最初のデータを取得します)
注:
ここでもう一度並べ替えてから値をグループ化しようとしましたが、結果は上記と同じです。
select
temp.name,temp.subject,max(temp.score)
from
(select * from score order by score desc) temp
group by temp.name
三、解決策
1.最初に名前と最大スコアを取り出します
select name,max(score) from score group by name
2.上記でクエリしたデータを一時テーブルとして使用して、元のテーブルをクエリします
select
temp_b.name,temp_b.subject,temp_b.score
from
(select name,max(score) score from score group by name) temp_a
inner join score temp_b
on
temp_a.name = temp_b.name and temp_a.score = temp_b.score
最終的な結果は次のとおりです。
問題は解決されました。それがすべての人に役立つことを願っています。より良い解決策がある場合は、コメント領域にメッセージを残してください。