[英]CakePHP Multi-Conditional SQL statement
使用CakePHP版本3.4.12和MySQL ...我在使用SQL時遇到了麻煩,然后在將SQL導入CakePHP時遇到了麻煩。 我想查看今天可能已進入和退出,今天或之前已進入,今天或之后已退出,或者它們今天或之前進入但仍沒有退出時間的記錄。 並跳過所有標記為非活動(inactive = true)的記錄。
數據摘錄:
id name time_in time_out inactive
174 smith 8/15/2017 21:00 8/15/2017 21:22 NULL
175 roberts 8/15/2017 21:21 8/15/2017 21:21 NULL
176 Wagner 9/2/2017 4:40 9/3/2017 18:29 0
177 JAmes 9/1/2017 3:35 NULL 0
178 john 9/4/2017 3:59 9/4/2017 22:22 NULL
180 erwer 9/4/2017 4:01 NULL 1
181 waynbe 9/4/2017 4:02 NULL NULL
182 Roger 9/4/2017 22:21 9/4/2017 22:22 NULL
183 Felix 9/4/2017 22:24 NULL NULL
如果我在SQL中犯了一個錯誤,我想查找所有
不是“ 非活動狀態 ”(不是TRUE)
還有哪里
'time_in'<= '2017年9月4日23時59分59秒'與'TIME_OUT'> = '2017年9月4日00:00:00'
- - 要么 - -
' time_out '為NULL AND'time_in '<='2017-09-04 23:59:59'
所需的返回結果是:
id name time_in time_out inactive
177 JAmes 9/1/2017 3:35 NULL 0
178 john 9/4/2017 3:59 9/4/2017 22:22 NULL
181 waynbe 9/4/2017 4:02 NULL NULL
182 Roger 9/4/2017 22:21 9/4/2017 22:22 NULL
183 Felix 9/4/2017 22:24 NULL NULL
我試圖實現的條件SQL是:
WHERE (time_in <= '2017-09-04 23:59:59' AND time_out >= '2017-09-04 00:00:00')
OR (isnull(time_out) AND time_in <= '2017-09-04 23:59:59')
AND inactive != 1
這給出了結果,並且缺少數據:
id name time_in time_out inactive
177 JAmes 9/1/2017 3:35 NULL 0
178 john 9/4/2017 3:59 9/4/2017 22:22 NULL
182 Roger 9/4/2017 22:21 9/4/2017 22:22 NULL
但是,在使用以下方法嘗試CakePHP時:
$query= $this->StationEntries->find('all')
->andWhere(['time_in <='=> $dateIn, 'time_out >='=>$dateOut])
->orWhere(['isnull(time_out)', 'time_in <='=> $dateIn])
->andWhere(['inactive !='=>true]);
創建SQL:
WHERE
(
(
(
time_in <= '2017-09-04 23:59:59'
AND time_out >= '2017-09-04 00:00:00'
)
OR (
isnull(time_out)
AND time_in <= '2017-09-04 23:59:59'
)
)
AND inactive != 1
)
這將返回以下結果,並且丟失更多記錄。
id name time_in time_out inactive
177 JAmes 9/1/2017 3:35 NULL 0
以下內容可以正常工作,只是它不會過濾掉不活動的記錄。
$query= $this->StationEntries->find('all')
->where(['time_in <='=> $dateIn, 'time_out >='=>$dateOut])
->orWhere(['isnull(time_out)', 'time_in <='=> $dateIn]);
我在書中讀過:
從3.5.0版開始,不推薦使用orWhere()方法。 這種方法很難根據當前查詢狀態預測SQL。 請改用where(),因為它更容易被發現並且更容易理解行為。 1
因此,我在兩個方面尋求幫助:
謝謝您的幫助。
根據文檔,要添加“ OR”子句,您需要將“ OR”作為array中的鍵 。 我認為您正在尋找:
->where(
[
'time_in <=' => $dateIn, 'time_out >=' => $dateOut,
'OR' => [
['time_out IS NULL', 'time_in <=' => $dateIn
]
]
)->andWhere( [ 'inactive !=' => 1 ] )
基本上,這應該導致:
(
(time_in < dateIn AND time_out < dateOut)
OR ( time_out IS NULL AND time_in < dateIn)
)
AND ( inactive != 1 )
您可以簡化為:
->where( [ 'time_in <=' => $dateIn ], [ 'inactive !=' => 1 ] )
->andWhere(
[
'time_out >=' => $dateOut,
'OR' => [ 'time_out IS NULL' ]
])
首先,IS NULL不等於!TRUE(!= 1)。 那是第一個問題。 固定。
正確的SQL來自原始的簡化查詢(感謝@cwallenpoole朝着正確的方向推進):
->where( [ 'time_in <=' => $dateIn, 'inactive IS NULL',
'OR' =>(['time_out >=' => $dateOut,'time_out IS NULL' ])])
如果從架構中刪除空值,則它將類似於:
->where( [ 'time_in <=' => $dateIn, 'inactive !=' =>1,
'OR' =>(['time_out >=' => $dateOut,'time_out IS NULL' ])])
結果導致CakePHP查詢:
WHERE
(
time_in <= '2017-09-04 23:59:59'
AND inactive IS NULL
AND (
time_out >= '2017-09-04 00:00:00'
OR time_out IS NULL
)
)
這將返回正確的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.