0

我想我在这个查询上非常接近,但似乎无法破解它,而且我不确定我是否有最有效的方法。

我试图从他们预订的一系列日期中找到用户没有被预订的那一天。

想想员工调度。我需要找出谁可以在星期二工作,而在本周的其他日子工作。

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

SELECT employees.uid、姓名、日期
来自员工
LEFT JOIN storelocation ON employees.uid = storelocation.uid
在 emplyees.uid = schedule.uid 上左加入计划
在哪里滑动 =9308
和日期
'2009-11-10' 之间
和“2009 年 12 月 20 日”
并不是
存在(

选择 uid
从时间表
日期 = '2009-11-11'
)

如果我不包括“不存在”,我会得到 1500 个结果如果我只使用“不存在”的选择表单,我会得到 200 个结果,所以这两个查询都是独立工作的。但是,我编写的查询返回 0 个结果。

4

2 回答 2

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'
)
于 2009-11-17T02:02:29.230 回答
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')

SELECTin anEXISTS子句不执行任何操作 - 您可以使用EXISTS( SELECT 1/0 ...这会导致“不能除以零”错误。但它不会...... 仅在 1+ 个实例与 WHERE/etc 子句匹配时才返回 true。如果您想阅读更多内容,那么关于 SO 有很多问题询问 SELECT 子句中的内容是否重要。EXISTS

吉姆的回答,除了拼写错误, MySQL中应该比我提供的替代方案更快。要了解有关原因的更多信息,请查看这篇文章:MySQL 中的 NOT IN vs NOT EXISTS vs LEFT JOIN/IS NULL

于 2009-11-17T03:01:25.017 回答