简化SQL查询的不等式

时间:2010-01-02 22:53:21

标签: sql ruby logic datamapper

作为参考,这个问题令人难以置信,感谢所有帮助解决问题的人。

我正在尝试在事件有不同长度的预订计划中找到潜在的事件碰撞。

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

我正在使用DataMapper来完成此任务,但我以前的查询是错误的。然后我想出了上面的内容,但我不确定如何将其转换为查询。以下是我对参考不正确的查询。

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

答案 0 :(得分:2)

我认为你真正想要的是:

(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. 之前没有完成
  5. a,e在x,y之后结束但在x,y之后没有开始
  6. 前两个部分与原始部分相同,但我必须更改后两部分以使其有意义并且正确。

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

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

答案 1 :(得分:0)

您提供的不平等可以简化为

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

可以进一步简化为

True

这可能是代码无效的原因。