2017-07-24 50 views
0

我有以下結構的數據庫表:MYSQL回出界日期

user_id (int) | status (int) | param1 (varchar) | param2 (varchar) | start (date) | external_id (int) 

我做下面的查詢:

db表的結構如下。

select 
    * 
from 
    `users_stuff` 
where 
    (
     `status` >= '8' 
     and `start` between '2017-07-01' and '2017-07-11' 
     and `outside_url` is not null 
     and (
      `param1` = '1' 
      and `param2` = 'A' 
     ) 
     or (
      `param1` = '0' 
      and `param2` = 'B' 
     ) 
     and `user_id` = '14' 
     and `external_id` is not null 
    ) 
    and `deleted_at` is null 

但是,當結果返回給我時,我會看到「開始」設置爲7月12日的項目。這是爲什麼?這會導致什麼問題呢?

謝謝!

+0

您可以添加數據庫方案和樣本數據庫記錄嗎? – chris85

+0

請勿使用無關標籤進行標記。我刪除了'php'和'laravel'標籤。一旦您的問題內容證明合理,請隨時將其退回。 –

+0

對不起,我只使用了Laravel標籤,因爲我使用的是Laravel,這是由Eloquent生成的。 – ackerchez

回答

1

我認爲OR條件的放置會產生這種行爲。我更新瞭如下的查詢:

select 
    * 
from 
    `users_stuff` 
where 
    (
     `status` >= '8' 
     and `start` between '2017-07-01' and '2017-07-11' 
     and `outside_url` is not null 
     and (
      `param1` = '1' 
      and `param2` = 'A' 

     or 
      `param1` = '0' 
      and `param2` = 'B' 
     ) 
     and `user_id` = '14' 
     and `external_id` is not null 
    ) 
    and `deleted_at` is null 
0

在AND之後看看你的ORST。 ()之間加上OR語句。

例如WHERE(AND標準OR標準)AND標準。

1

這裏會出現什麼問題?

您的查詢乍看上去故障,並可能導致意外的行爲,比如你做

`status` >= '8' 

然而statusint,不是S string你對待它。對於所有其他未知原因的整數在您的任務中都會引用相同的情況。所以,解決語法和刪除整數週圍所有的報價,所以即說

`status` >= '8' 

成爲

`status` >= 8 

PS:由於小「優化」,我會在開始時移動and deleted_at is nullwhere子句:where deleted_at is null and ...因爲如果deleted_at不爲空,那麼評估剩餘條件就沒有意義。