我有一个包含以下字段的教师表
id | name
----------------
1 | Teacher 1
2 | Teacher 2
3 | Teacher 3
----------------
另一个名称可用的表
id | teacher_id | date
-------------------------------
1 | 2 | 2014-04-23
2 | 3 | 2014-04-22
-------------------------------
学生可以使用以下查询搜索某一天的教师是否可用
SELECT *
FROM teachers, available
WHERE available.teacher_id = teachers.id
AND available.date = "2014-04-23"
LIMIT 0 , 30
直到现在一切都很好。
现在更改是:默认情况下,教师将全天候可用。因此,可用表开始仅存储特定教师不可用的日期。
现在问题是使用以下查询,如果他们在可用性表中有任何条目,我可以获得在特定日期可用的教师。
SELECT *
FROM teachers, available
WHERE available.teacher_id = teachers.id
AND available.date != "2014-04-23"
LIMIT 0 , 30
由于教师1在可用性表中没有条目,并且默认情况下所有教师都可以全天使用,我无法使用上述查询列出他/她。
请问有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
您需要使用LEFT JOIN:
SELECT techers.*
FROM
teachers LEFT JOIN available
ON teachers.id = available.teacher_id
AND avaliable.date = '2014-04-23'
WHERE
available.teacher_id IS NULL
这将返回所有在可用表格中没有记录且具有给定日期的教师。
请参阅此链接,了解ANTI JOIN(table1中所有不在table2中的值)。
或者您可以使用NOT EXISTS:
SELECT *
FROM teachers
WHERE
NOT EXISTS (SELECT *
FROM available
WHERE teachers.id = available.teacher_id
AND available.date = '2014-04-23')