【问题标题】:MySql query where to use more than 2 conditionsMySql查询在哪里使用超过2个条件
【发布时间】:2021-05-07 21:56:49
【问题描述】:

我需要找到所有注册了课程操作系统设计但没有注册数据库系统设计的学生的姓名。所以我写了这个查询。这里学生是第一个表,注册的是第二个表,snum 作为外键。

select s.sname 
from student s, enrolled e 
where(s.snum=e.snum 
    AND e.cname="Operating System Design" 
    AND e.cname!="Database Systems"
    );

它只是打印注册操作系统设计的学生的姓名,如果它只是检查第一个条件。

【问题讨论】:

  • 您将需要一些比多个 WHERE 条件更复杂的东西。这需要某种形式的子查询或左连接来将Operating System Design 结果的结果与单独的Database Systems 结果进行比较

标签: mysql aggregate-functions


【解决方案1】:

您必须正确连接 2 个表,按学生分组并在 HAVING 子句中使用条件聚合:

SELECT s.id, s.sname 
FROM student s INNER JOIN enrolled e 
ON s.snum = e.snum  
GROUP BY s.id, s.sname
HAVING MAX(e.cname = 'Operating System Design') = 1
   AND MAX(e.cname = 'Database Systems') = 0

我在GROUP BY 子句和SELECT 中都使用了学生的ID,以防sname 列不是唯一的。
如果它是唯一的,您可以将其删除。

您也可以使用EXISTS

SELECT s.id, s.sname 
FROM student s 
WHERE EXISTS (SELECT 1 FROM enrolled e WHERE s.snum = e.snum AND e.cname = 'Operating System Design')
AND NOT EXISTS (SELECT 1 FROM enrolled e WHERE s.snum = e.snum AND e.cname = 'Database Systems')

【讨论】:

  • 感谢您的解决方案。就是想问一下,如果我用的条件多的话,是不是每次都要用这个Max呢,还是还有别的办法呢。
  • @HimanshuKaushik 对每个单独的条件使用一次。
  • 为什么select语句中有1是什么意思。
  • @HimanshuKaushik 1 没什么特别的,它可以是 0、null 或 *。如果满足 WHERE 之后的条件,它只是一个返回的值。如果不满足条件,则不会返回任何内容,并且 EXISTS 将为 FALSE,或者 NOT EXISTS 将为 TRUE。
  • 感谢先生您的时间和解决方案。 :)
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
相关资源
最近更新 更多