在选择中选择查询

时间:2018-07-28 14:41:25

标签: mysql sql

对于下一个问题,我找不到正确的查询。 (参见图片)

enter image description here

此表在此附表,其中第1天是星期一,第2天是星期二,.. 我必须找出哪个老师在第一个小时的星期一有空,但是由于在当天晚些时候要教书而在学校里。因此,结果可能只会给约翰和苏珊,而不会给马克和汤姆,因为他们那天不必教书。

我尝试了简单查询和嵌套查询,但没有一个给出正确的结果。

select distinct Teacher from Schedule where Day = 1 and Hour <> 1 order by Teacher  ASC  

select distinct Teacher from Schedule where Day = 1 and NOT Hour = 1 order by Teacher  ASC 

更复杂的查询没有任何作用。

我在做什么错了?

1 个答案:

答案 0 :(得分:3)

在这种特殊情况下,可能可以使用聚合。检查老师一天中的最小小时数是否大于1。

SELECT teacher
       FROM schedule
       WHERE day = 1
       GROUP BY teacher
       HAVING min(hour) > 1;

对于任何一天和任何时间,更通用的方法都可以使用条件聚合。仅当老师在一天中指定一个小时时才算。因此,当计数为0时,我们知道他们在给定的时间不教书。

SELECT teacher
       FROM schedule
       WHERE day = ?
       GROUP BY teacher
       HAVING count(CASE
                      WHEN hour = ? THEN
                        1
                    END) = 0;

(分别用日期或小时的值替换?。)

另一种方法是使用NOT EXISTS和相关的子查询。

SELECT DISTINCT s1.teacher
       FROM schedule s1
       WHERE s1.day = ?
             AND NOT EXISTS (SELECT *
                                    FROM schedule s2
                                    WHERE s2.day = s1.day
                                          AND s2.teacher = s1.teacher
                                          AND s2.hour = ?);

如果您有一张包含所有老师的表格,您还可以将其用作来源,并按{{1}(针对当天)和EXISTS(针对日期和小时)进行过滤}}。