我认为我对此查询非常接近,但似乎无法破解它,我不确定我是否拥有最有效的方法。
我正在努力寻找一个用户未在预订日期范围内预订的日子。
考虑员工安排。我需要在星期二找到可以工作的人,并在本周的其他日子工作。
我的查询目前看起来像这样
SELECT employees.uid, name, date FROM employees LEFT JOIN storelocation ON employees.uid = storelocation.uid LEFT JOIN schedule ON emplyees.uid = schedule.uid WHERE slid =9308 AND date BETWEEN '2009-11-10' AND '2009-12-20' AND NOT EXISTS ( SELECT uid FROM schedule WHERE date = '2009-11-11' )
如果我不包含'Not Exists',我会得到1500个结果 如果我只使用Select表格'Not Exists',我会得到200个结果,因此这两个查询都是独立运作的。 但是,我写的查询返回0结果。
答案 0 :(得分:1)
你可能想尝试更像这样的东西:
SELECT employees.uid, name, date
FROM users
LEFT JOIN storelocation ON employees.uid = storelocation.uid
LEFT JOIN schedule ON emplyees.uid = schedule.uid
WHERE slid =9308
AND date BETWEEN '2009-11-10' AND '2009-12-20'
AND employees.uid NOT IN (
SELECT uid
FROM schedule
WHERE date = '2009-11-11'
)
答案 1 :(得分:1)
问题是您的NOT EXISTS
没有相关性,如果不使用表别名,您就无法做到这一点:
SELECT e.uid,
e.name,
s.date
FROM EMPLOYEES e
LEFT JOIN STORELOCATION sl ON sl.uid = e.uid
LEFT JOIN schedule s ON s.uid = e.uid
AND s.date BETWEEN '2009-11-10'AND '2009-12-20'
WHERE slid = 9308
AND NOT EXISTS (SELECT NULL
FROM SCHEDULE t
WHERE t.uid = e.uid
AND t.date = '2009-11-11')
SELECT
子句中的EXISTS
无法执行任何操作 - 您可以使用EXISTS( SELECT 1/0 ...
, 会导致“无法除以零”错误。但是,如果1个实例与WHERE / etc子句匹配,它将不会返回true EXISTS
。如果你想阅读更多内容,有很多关于SO的问题,询问SELECT子句中的内容是否重要。
Jim的答案,错误的错误,应该比我提供的替代品 MySQL 更快。要详细了解原因,请查看以下文章:NOT IN vs NOT EXISTS vs LEFT JOIN/IS NULL in MySQL。