【问题标题】:retrieve available day from date rante从日期范围中检索可用的日期
【发布时间】:2010-12-17 07:06:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 对不起,我已经编辑过了。我输入的是“用户”而不是“员工”

标签: sql mysql not-exists


【解决方案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'
)

【讨论】:

  • 谢谢 Jim,我以为您的意思是“NOT IN”,但除此之外,我的印象是 IN 在处理较大的查询时效率低下。
  • 是的,没错。这应该是过滤结果的一种相当有效的方法。
【解决方案2】:

问题是您的 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')

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

Jim 的回答,除了拼写错误之外,应该比我提供的替代方案更快 in MySQL。要详细了解原因,请查看这篇文章:NOT IN vs NOT EXISTS vs LEFT JOIN/IS NULL in MySQL

【讨论】:

    猜你喜欢
    • 2019-01-17
    • 2014-01-07
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多