Wenn ich auf ein Szenario stoße, muss ich die Daten gruppieren und dann die ersten 10 Daten in jeder Gruppe abrufen. Zuerst dachte ich daran, sie zu verwenden Gruppieren Sie nach, aber die Schwierigkeit besteht darin, dass Sie nach dem Gruppieren wissen, welches Element die Daten in der Gruppe einordnen?
CREATE TABLE `score` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `subject` varchar(20) DEFAULT NULL COMMENT '科目', `student_id` int(11) DEFAULT NULL COMMENT '学生id', `student_name` varchar(20) NOT NULL COMMENT '学生姓名', `score` double DEFAULT NULL COMMENT '成绩', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
Analyse: verwendet eine Unterabfrage, und die Kern-SQL ist die Bedingung nach wo: #🎜🎜 ####每科成绩前三名 SELECT * FROM score s1 WHERE ( SELECT count( * ) FROM score s2 WHERE s1.`subject` = s2.`subject` AND s1.score < s2.score ) < 3 ORDER BY SUBJECT, score DESCNach dem Login kopieren
( SELECT count( * ) FROM score s2 WHERE s1.subject = s2.subject AND s1.score < s2.score ) < 3
Wenn die Frage darin besteht, die Datensätze abzufragen, deren Punktzahlen in jedem Fach in der obigen Tabelle größer oder gleich 90 Punkten sind, wie schreibt man dann die SQL? 1. Die erste Schreibweise: positives Denken
Wenn die Punktzahl in jedem Fach größer als 90 Punkte ist, muss auch die niedrigste Punktzahl größer oder gleich sein 90 Punkte. Die SQL lautet wie folgt:# 🎜🎜#
public class StudentTest { public static void main(String[] args) { List<Student> list = new ArrayList<>(); //初始化和表结构一致的数据 initData(list); //记录查询出来的结果 List<Student> result = new ArrayList<>(); for(Student s1 : list){ int num = 0; //两次for循环遍历,相当于sql里面的子查询 for(Student s2:list){ //统计同一科目,且分数s2分数大于s1的数量,简单理解就是同一科目的学生记录,比s1的学生分数高的数量 if(s1.getSubject().equals(s2.getSubject()) &&s1.getScore()<s2.getScore()){ num++; } } //比s1的学生分数高的数量,如果小于3的话,说明s1这个排名前三 // 举例:num=0时,说明同一科目,没有一个学生成绩高于s1学生, s1学生的这科成绩排名第一 // num =1,时,s1学生排名第二,num=3时:说明排名同一科目有三个学生成绩高过s1,s1排第四,所以只统计前三的学生,条件就是num<3 if(num < 3){ result.add(s1); } } //输出各科成绩前三的记录 result.stream() .sorted(Comparator.comparing(Student::getSubject)) .forEach( s-> System.out.println(String.format("学生:%s,科目:%s,成绩:%s",s.getName(),s.getSubject(),s.getScore())) ); } public static void initData(List<Student> list) { list.add(new Student(1,"语文","张三",59)); list.add(new Student(2,"数学","张三",78)); list.add(new Student(3,"英语","张三",65)); list.add(new Student(4,"语文","李四",88)); list.add(new Student(5,"数学","李四",58)); list.add(new Student(6,"英语","李四",65)); list.add(new Student(7,"语文","王五",92)); list.add(new Student(8,"数学","王五",99)); list.add(new Student(9,"英语","王五",96)); list.add(new Student(10,"语文","小张",90)); list.add(new Student(11,"数学","小张",91)); list.add(new Student(12,"英语","小张",90)); list.add(new Student(13,"语文","小华",88)); list.add(new Student(14,"数学","小华",79)); list.add(new Student(15,"英语","小华",77)); } @Data public static class Student { private int id; private String subject; private String name; private double score; //想当于表结构 public Student(int id, String subject, String name, double score) { this.id = id; this.subject = subject; this.name = name; this.score = score; } }
SELECT * FROM score WHERE student_id IN (SELECT student_id FROM score GROUP BY student_id HAVING min( score ) >= 90 )
SELECT * FROM score WHERE student_id NOT IN (SELECT student_id FROM score GROUP BY student_id HAVING max( score ) < 90 )
Das obige ist der detaillierte Inhalt vonMySQL implementiert, wie man SQL schreibt, um nach der Unterscheidung nach Gruppen die ersten paar in jeder Gruppe zu erhalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!