Heim  >  Artikel  >  Datenbank  >  MySQL implementiert, wie man SQL schreibt, um nach der Unterscheidung nach Gruppen die ersten paar in jeder Gruppe zu erhalten

MySQL implementiert, wie man SQL schreibt, um nach der Unterscheidung nach Gruppen die ersten paar in jeder Gruppe zu erhalten

王林
王林nach vorne
2023-05-31 09:01:241677Durchsuche

    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?

    1. Erstellen Sie eine Tabelle und fügen Sie relevante Testdaten ein Am Ende können Freunde die folgende SQL selbst überprüfen. Dann schreibe SQL, SQL ist wie folgt:

    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;

    MySQL implementiert, wie man SQL schreibt, um nach der Unterscheidung nach Gruppen die ersten paar in jeder Gruppe zu erhalten

    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 DESC

    Die Bedeutung dieser SQL ist. . .

    Ich habe das Gefühl, dass meine Sprache etwas schwer zu beschreiben ist, daher werde ich meinen vertrauten Java-Code verwenden, um das obige SQL zu beschreiben, bei dem es sich wahrscheinlich um eine for-Schleife handelt, die zweimal durchlaufen wird, und Statistiken werden dies tun Die Anzahl der Schülerdatensätze im selben Fach, die eine höhere Punktzahl als die von s1 aufweisen, bedeutet, dass s1 unter den ersten drei liegt

    ( SELECT count( * ) FROM score s2 WHERE s1.subject = s2.subject AND s1.score < s2.score ) < 3
    MySQL implementiert, wie man SQL schreibt, um nach der Unterscheidung nach Gruppen die ersten paar in jeder Gruppe zu erhaltenSie können sehen, dass der Code nach dem Ausführen gedruckt wird. Das Ergebnis ist das gleiche wie das Ergebnis nach der Ausführung von SQL

    3 . Fragen Sie die Aufzeichnungen von Schülern ab, deren Ergebnisse in jedem Fach größer oder gleich 90 Punkte sind. 🎜🎜#

    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;
        }
    }

    2. Die zweite Schreibweise: umgekehrtes Denken

    Schließen Sie Datensätze mit der höchsten Punktzahl von weniger als 90 Punkten aus

    SELECT
    	* 
    FROM
    	score 
    WHERE
    	student_id IN  
    	  (SELECT student_id FROM score GROUP BY student_id HAVING min( score ) >= 90 )
    MySQL implementiert, wie man SQL schreibt, um nach der Unterscheidung nach Gruppen die ersten paar in jeder Gruppe zu erhalten

    Bemerkungen: Positiv Schauen Sie sich die spezifische Situation an und wählen Sie

    Andere Erzählungen

    Überprüfen die Aufzeichnungen von Schülern, deren durchschnittliche Punktzahl in jedem Fach mehr als 80 Punkte beträgt Einfügung

    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!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen