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

最終的な結果は次のとおりです。
ここに写真の説明を挿入
問題は解決されました。それがすべての人に役立つことを願っています。より良い解決策がある場合は、コメント領域にメッセージを残してください。

おすすめ

転載: blog.csdn.net/weixin_42201180/article/details/107359673