选择中的选择查询

lmyy7pcs  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(328)

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

在此表中,第一天是星期一,第二天是星期二。。我必须找出哪位老师周一第一个小时有空,但在学校,因为他/她必须在那天晚些时候教书。所以结果可能只会给约翰和苏珊,而不会给马克和汤姆,因为他们不必在那天教书。
我尝试了简单查询和嵌套查询,但都没有给出正确的结果。

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

更复杂的查询没有任何区别。
我做错什么了?

qlvxas9a

qlvxas9a1#

在这种特殊情况下,可以使用聚合。检查教师每天的最小小时数是否大于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 = ?);

如果您有一个包含所有教师的表,您也可以将其用作源并按 EXISTS (当天)和 NOT EXISTS (白天和小时)瞄准 schedule .

相关问题