首页 > 其他分享 >leetcode-1280-学生参加各科测试的次数

leetcode-1280-学生参加各科测试的次数

时间:2024-10-25 09:21:44浏览次数:1  
标签:1280 name stu 学生 student id subject leetcode 各科

链接:1280. 学生们参加各科测试的次数 - 力扣(LeetCode)

前提条件:

学生表: Students

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| student_id    | int     |
| student_name  | varchar |
+---------------+---------+
在 SQL 中,主键为 student_id(学生ID)。
该表内的每一行都记录有学校一名学生的信息。

科目表: Subjects

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| subject_name | varchar |
+--------------+---------+
在 SQL 中,主键为 subject_name(科目名称)。
每一行记录学校的一门科目名称。

考试表: Examinations

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| student_id   | int     |
| subject_name | varchar |
+--------------+---------+
这个表可能包含重复数据(换句话说,在 SQL 中,这个表没有主键)。
学生表里的一个学生修读科目表里的每一门科目。
这张考试表的每一行记录就表示学生表里的某个学生参加了一次科目表里某门科目的测试。

查询出每个学生参加每一门科目测试的次数,结果按 student_id 和 subject_name 排序。

查询结构格式如下所示。

SQL语句
 CREATE TABLE Students (
    student_id INT,
    student_name VARCHAR(255)
);

CREATE TABLE Subjects (
    subject_name VARCHAR(255)
);

CREATE TABLE Examinations (
    student_id INT,
    subject_name VARCHAR(255)
);
INSERT INTO
        Students
VALUES
        (1, 'Alice'),
        (2, 'Bob'),
        (13, 'John'),
        (6, 'Alex');

INSERT INTO
        Subjects
VALUES
        ('Math'),
        ('Physics'),
        ('Programming');

INSERT INTO
        Examinations
VALUES
        (1, 'Math'),
        (1, 'Physics'),
        (1, 'Programming'),
        (2, 'Programming'),
        (1, 'Physics'),
        (1, 'Math'),
        (13, 'Math'),
        (13, 'Programming'),
        (13, 'Physics'),
        (2, 'Math'),
        (1, 'Math');

思路:

  1. 查询内容:学生id(students),学生姓名(students),课程名称(Subjects),参加次数,有的同学一次没有参加,有的多次参加
  2. Students和Subjects用CROSS JOIN得到所有组合,以此表作为基础
  3. Examinations按照student,subject_name得到student_id, subject_name, attends_name
  4. 2 LEFT JOIN 3然后分组
  5. 查询结果

优化:

实现:

  1. SELECT
            stu.student_id,
            stu.student_name,
            sub.subject_name
    FROM
        students stu CROSS JOIN subjects sub;

  2.

SELECT
                    student_id, subject_name,COUNT(*) attend_exams
           FROM
                    Examinations
           GROUP BY
                    student_id, subject_name

3.

SELECT
        stu.student_id student_id,
        stu.student_name  student_name,
        sub.subject_name subject_name,
        ifnull(grouped.attend_exams , 0) attend_exams
FROM
       students stu CROSS JOIN  Subjects sub
                 LEFT JOIN (SELECT
                                     student_id, subject_name,COUNT(*) attend_exams
                            FROM
                                     Examinations
                            GROUP BY
                                     student_id, subject_name
                            )grouped ON stu.student_id = grouped.student_id AND
                                        sub.subject_name = grouped.subject_name
ORDER BY
    stu.student_id,sub.subject_name ;

 

标签:1280,name,stu,学生,student,id,subject,leetcode,各科
From: https://www.cnblogs.com/kezz/p/18501784

相关文章

  • 【每日一题】LeetCode - 最长回文子串
    在字符串相关的算法题中,寻找最长回文子串是一个经典且富有挑战性的题目。本篇将详细分析并推导两种有效的解决方案:动态规划法和中心扩展法。题目描述给定一个字符串s,我们需要找到s中最长的回文子串。回文是指正着读和反着读都相同的字符串。例如,输入"babad"时,输出可......
  • 【leetcode-面试经典 150 题】-4.删除有序数组中的重复项 II
    题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用O(1)额外空间的条件下完成。示例1:输入:nums=[1,1,1,2,2,3]输出:5,nums=......
  • 【leetcode-面试经典 150 题】-1.合并两个有序数组
    题目:给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 ......
  • LeetCode常用算法模板
    代码模板  1、DFS:适用于树和图的遍历、组合问题。2、BFS:适用于树和图的层次遍历、最短路径问题。3、二分查找:适用于有序数组的搜索问题。4、动态规划:适用于最优化问题、序列问题。5、贪心算法:适用于局部最优问题、调度问题。6、回溯算法:适用于组合、排列、子集问题。......
  • Leetcode每日一题:3175. 找到连续赢 K 场比赛的第一位玩家
    题意为给定一个数组,数组头两数比大小,大的放队首,小的放队尾,找到能够连续赢K次的数的编号。思路:如果一轮比较完了,没有赢K次的,那答案就是数组最大值。利用双指针,模拟一轮比较,计算每个数的胜利次数,注意,若起点不是0的话,意味着他和之前的数比较是胜出的,所以初始为1,否则初始为0;1clas......
  • [LeetCode] 951. Flip Equivalent Binary Trees
    ForabinarytreeT,wecandefineaflipoperationasfollows:chooseanynode,andswaptheleftandrightchildsubtrees.AbinarytreeXisflipequivalenttoabinarytreeYifandonlyifwecanmakeXequaltoYaftersomenumberofflipoperations......
  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作,......
  • leetcode-1661-每台机器的平均运行时间
    链接:1661.每台机器的进程平均运行时间-力扣(LeetCode)前提条件:表: Activity+----------------+---------+|ColumnName|Type|+----------------+---------+|machine_id|int||process_id|int||activity_type|enum||timest......
  • c++ 构成整天的下标对数目 leetcode
    目录一、leetcode3184.构成 整天 的下标对数目I1.问题描述 2.方法:暴力穷举二、leetcode3185.构成 整天 的下标对数目II1.问题描述2.方法:哈希表一、leetcode3184.构成 整天 的下标对数目I1.问题描述给你一个整数数组 hours,表示以 小时 为单位的时间,返......
  • leetcode-197-上升的温度
    链接:197.上升的温度-力扣(LeetCode)前提条件:表: Weather+---------------+---------+|ColumnName|Type|+---------------+---------+|id|int||recordDate|date||temperature|int|+---------------+---------+id是......