mysql - 如果(作为一个组)满足条件,则获取表中的每一行

标签 mysql sql

我有两个表:Students (id, fname, lname)Registrar (id, student_id, class_id)。我教一个类(class) ID 为 99 的类(class)。我想找到类(class)中的所有学生,并列出这些学生和他们正在上的所有其他类(class)。我可以执行以下操作:

SELECT s.fname, s.lname, r.class_id FROM
    Students AS s JOIN Registrar AS r ON s.id = r.student_id WHERE
      r.student_id IN
         (SELECT student_id FROM Registrar WHERE class_id = 99);

这行得通,但速度很慢。我对此没有太多经验(正如我的标题所暗示的,我不知道这叫什么),但我猜这是一个相当普遍的问题。任何指向正确方向的指示都是最受欢迎的。

最佳答案

这应该有效。在 class_id = 99 条件下加入 registar 表一次,然后在没有 class_id 限制的情况下再次加入该学生的所有类(class)。

select s.fname, s.lname, r2.class_id
  from students s
    inner join registrar r
      on s.id = r.student_id
        and r.class_id = 99
    inner join registrar r2
      on s.id = r2.student_id;

demo fiddle here

在 registrar 表中使用索引 (student_id, class_id),在学生表中使用 id,这应该非常快。

基于评论 可能会重复上课 - 我们可以分组以摆脱这些:

select s.fname, s.lname, r2.class_id
  from students s
    inner join registrar r
      on s.id = r.student_id
        and r.class_id = 99
    inner join registrar r2
      on s.id = r2.student_id
  group by s.id, r2.class_id

这在某种程度上滥用了 mysql 对 group by 的处理,但没关系,因为 fnamelname 在每个组中的每一行中都是相同的

关于mysql - 如果(作为一个组)满足条件,则获取表中的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29980605/

相关文章:

java - Joda Time - Hibernate 将昨天的日期插入数据库

sql - T-Sql 对多行的字符串序列进行计数

SQL 选择查询内连接多对多重构

MySQL 创建触发器语法

MySql 查询两个不同表的关系

MySQL动态搜索查询程序

mysql - 尝试将数据从同一表sql中的一列复制到另一列时出错

c# - 判断结果是否多于请求(分页)的最佳方法?

mysql - 使用 NOT IN 子查询返回 0 行的查询

php - SQL - 如果记录存在于表中,则插入到表中