【问题标题】:MySQL select rows for which no related row exists for each date in a date rangeMySQL选择日期范围内每个日期不存在相关行的行
【发布时间】:2016-03-18 06:38:53
【问题描述】:

我有一个查询,它根据特定日期不存在的相关表中的行从一个表中进行选择。现在,我在感兴趣的每个日期都多次调用此查询。但出于性能原因,我希望对数据库进行一次往返。我想将此查询扩展为在一个日期范围内工作,并返回该范围内的所有行,其中每个日期在另一个表中没有相关行(即范围内每个日期的当前查询结果的 UNION)。结果必须在每一行中包含日期本身。我当前的查询是这样的:

   SELECT 
          t1.id,
          t1.field1,
          t1.field2, 
          '2016-03-17' AS nightof_date,
          1 as marker
        FROM 
          t1
        LEFT JOIN t2 ON (
          (t2.a_date = '2016-03-17') 
          AND (t2.t1_id=t1.id) 
          AND (some conditions...))
        WHERE 
          (t2.id is NULL)
          AND (some other conditions...)
        GROUP BY 
           t1.field3;

这是一个单一查询的小提琴: http://sqlfiddle.com/#!9/553d49/6/0

以下是我想要实现的结果,开始日期为 2016 年 3 月 17 日,结束日期为 2016 年 3 月 20 日: http://sqlfiddle.com/#!9/553d49/6/0

(我想我可以以编程方式生成一个像这样的怪物联合查询,但我希望有一些更优雅的东西,我可以只使用开始日期和结束日期)

有没有办法在不使用NUMBERS 或类似技巧的情况下做到这一点(即,我希望不必生成单独的表格)?

【问题讨论】:

  • 您的意思是说,现在您的查询只针对单个日期,您需要将其转换为日期范围,对吗?
  • 是的——我试图避免必须创建一个表,即属于“类似技巧”类别。但也许这是唯一的方法。
  • 在 t1 上没有日期——从技术上讲,第三个表 t3 与 t1 相关,它具有不同的日期范围,通过要求我正在查看的日期包含在 t3 中来限制来自 t1 的数据范围(即它是 where 子句的“其他条件”的一部分)——但我希望这不会真正影响问题,所以为了简单起见,我把它省略了。
  • 如果 SO 只是拒绝发布没有示例数据和期望结果的 SQL 相关问题,那就太好了
  • @Strawberry 点。这是一个小提琴:sqlfiddle.com/#!9/553d49/2/0我希望将结果与 2016-03-17、2016-03-18、2016-03-19 一起运行在一个表中(但对于任意开始和结束日期)。

标签: mysql sql


【解决方案1】:

这对你有帮助吗?

SELECT 
      t1.id,
      t1.name,
      t1.birth, 
      '2015-01-01 AND 2015-01-03' AS nightof_date
    FROM 
      t1
    LEFT JOIN t2 ON (t2.t1_id=t1.id
                    AND
                    (t2.birth BETWEEN '2015-01-01' AND '2015-01-03')) 
         WHERE (t2.id is NULL)
    GROUP BY 
       t1.name;

【讨论】:

  • 不是真的,看看这个小提琴是否澄清:sqlfiddle.com/#!9/553d49/2/0 我希望这个查询的结果联合在一个范围内的每个日期运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多