我有三张桌子

1.)学生(身份证、名字、姓氏、邮箱)

2.)Course_Students(Student_id,Course_id)

3.)课程(id,名称,课堂id)

我需要 Select 所有咒骂次数等于或等于3的学生.

我构建了这个 Select ,看起来它是有效的,但我很好奇,是否会有更有效的方法来 Select :

select 
  s.firstName, s.Surname 
from 
  students s  
inner join 
  course_student cs 
on 
  s.id = cs.student_id 
and 
  cs.course_id 
in 
  (select 
     course_id 
   from 
     course_student 
   group by 
     course_id 
   having count(*) >= 3
  );

推荐答案

你可以把每IN个子句变成一个INNER JOIN

select 
  s.firstName, s.Surname 
from 
  students s  
inner join 
  course_student cs 
on 
  s.id = cs.student_id 
JOIN   (select 
     course_id 
   from 
     course_student 
   group by 
     course_id 
   having count(*) >= 3
  ) c ON c.course_id =  cs.course_id 

Mysql相关问答推荐

使用JSON_CONTAINS搜索多个值的原理

docker-compose:无法将应用程序服务连接到 mysql 数据库,收到错误:用户‘root’@‘localhost’访问被拒绝(使用密码:YES)

查询优化并提高性能

使用 SELECT 时应锁定多少行 .. FOR UPDATE LIMIT 1

Group By 查询运行速度太慢而无法正常运行

如何在Pandas 中使用 to_sql

如何在 SQL 中计算留存曲线?

如何查询由另一个查询创建的表?

如何替换 SELECT 查询中重复记录的列?

有没有更好的方法在无限滚动的网页上呈现获取的提要数据?

如何过滤表格,以便它显示最新的数据?

如何在 MySQL 上一次删除一系列记录?

如何删除没有临时表的 MySQL 表中的所有重复记录

SQL - 如何找到列中的最高数字?

如何在 MySQL 的日期时间字段中存储 NULL 值?

MySQL错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)

为什么 MySQL 自动增量会在插入失败时增加?

ON UPDATE RESTRICT 有什么作用?

来自 MySQL 中多个表的 COUNT(*)

AWS RDS 实例升级停机时间