我无法弄清楚为什么mysql查询在不应该返回结果时返回结果,这是事情: 我试图返回一段时间内不可用的用户的结果。 因此,我将表可用性不可用的开始日期时间和不可用的结束日期时间与用户的外键。 现在我有我想要测试的选定日期时间。
以下是查询:
User::whereHas('availabilities', function($q)use($selected_date_time)
{
$q->where('unavailable_start_date', '>', $selected_date_time)
->where('unavailable_end_date', '>', $selected_date_time)
;
})
->orWhereHas('availabilities', function($q)use($selected_date_time)
{
$q->where('unavailable_start_date', '<', $selected_date_time)
->where('unavailable_end_date', '<', $selected_date_time)
;
})
->with('availabilities')
->get();
以下是手动对用户进行的逻辑测试的结果,以查看测试是错误的还是查询中的问题:
selected string(19) "2014-11-13 10:30:00"
unavailableStart string(19) "2014-11-12 11:30:00"
unavailableEnd string(19) "2014-11-18 11:00:00"
$undateS > $selected_date_time : result = bool(false)
$undateE > $selected_date_time : result = bool(true) ==> two above && return false
$undateS < $selected_date_time : result = bool(true)
$undateE < $selected_date_time : result = bool(false) ==> two above && return false
正如你所看到的,OR测试将返回FALSE,这意味着该用户不应该出现在结果中......奇怪的是,我有另一个用户也被设置为在相似的时间段内不可用,他不会在结果中返回.....
我在这方面做错了什么?
编辑执行SQL:
select * from `users` where `is_user` = ? and (select count(*) from `availabilities` where `availabilities`.`user_id` = `users`.`id` and `unavailable_start_date` > ? and `unavailable_end_date` > ?) >= 1 or (select count(*) from `availabilities` where `availabilities`.`user_id` = `users`.`id` and `unavailable_start_date` < ? and `unavailable_end_date` < ?) >= 1
感谢您的帮助!