代码之家  ›  专栏  ›  技术社区  ›  arbales

简化SQL查询的不等式

  •  0
  • arbales  · 技术社区  · 16 年前

    作为参考,这个问题令人费解,所以感谢所有帮助解开它的人。

    我正试图在一个预订程序中定位事件的潜在冲突,在这个程序中,事件的长度是不同的。

    (a ≤ x && e ≥ y) || (a ≥ x && e ≤ y) || (a ≤ x && e ≤ y) || (a ≥ x && e ≥ y)

    我正在使用数据映射器来完成这项工作,但我以前的查询是错误的。然后我了解了上面的内容,但我不知道如何将其转换为查询。下面是我的 不正确的 查询 参考 .

    class Table
      def is_available?
         return false if (TableBooking.all(:at.lte => params[:at], :at.gt => params[:ending], :ending.gt => params[:at], :ending.gte => params[:at]).count > 0)
      end
    end
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Amber    16 年前

    我想你真正想要的是:

    (a ≤ x && e ≥ y) || (a ≥ x && e ≤ y) || (a ≤ x && e ≥ x) || (a ≤ y && e ≥ y)
    

    因为这说明了(按上述顺序对应于每一组)

    1. a,e包括x,y
    2. a,e包含在x,y中
    3. a,e在x,y之前开始,但不在x,y之前结束
    4. a,e在x,y之后结束,但不在x,y之后开始

    前两部分和你的原稿一样,但我不得不修改后两部分,使之合理和正确。

    这实际上也可以简化,因为3和4会自动捕获1,所以您只需要2-4:

    (a ≥ x && e ≤ y) || (a ≤ x && e ≥ x) || (a ≤ y && e ≥ y)
    
        2
  •  0
  •   BlueRaja - Danny Pflughoeft    16 年前

    你给出的不等式可以简化为

    (a ≤ x || a ≥ x) && (e ≤ y || e ≥ y)  
    

    可以进一步简化为

    True
    

    这可能就是代码不起作用的原因。