从日期范围检索可用日期

时间:2009-11-17 01:52:53

标签: sql mysql not-exists

我认为我对此查询非常接近,但似乎无法破解它,我不确定我是否拥有最有效的方法。

我正在努力寻找一个用户未在预订日期范围内预订的日子。

考虑员工安排。我需要在星期二找到可以工作的人,并在本周的其他日子工作。

我的查询目前看起来像这样

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结果。

2 个答案:

答案 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