2011-06-07 52 views
0

我有這個數據庫查詢:添加列名= 3倍的回報要少得多結果

select  scheduled_hike_id 
     , hike_date 
     , hike_title 
     , hike_group_id 
     , hike_privacy 
     , hike_description 
     , DAYOFMONTH(hike_date) 
     , DAYNAME(hike_date) 
     , YEAR(hike_date) 
     , MONTH(hike_date) 
from  scheduled_hikes 
where  is_cancelled is null 
and   hike_date > DATE_ADD(NOW(), INTERVAL -1 DAY) 
and   show_on_home_page = 1 
order by hike_date limit 4 

它返回我的預期。當我添加一個子句「和hike_privacy!= 3」時,它會返回很多少數結果。

列的其它值爲空,1,2

任何想法,爲什麼!= 3不工作如我所料?另外,< 3也給出了類似的意外結果。我使用的是MySQL

+1

您的查詢中有'LIMIT 4'。你期望得到多少記錄? – Tadeck 2011-06-07 01:29:50

回答

0

如果hike_privacy是null,它不會匹配hike_privacy != 3

嘗試:and (hike_privacy != 3 or hike_privacy is null)

空值永遠不會匹配非 「零式」 的比較。

注意:請確保您使用「OR」術語的括號!在SQL或優先,所以沒有括號它會分析,如果它是編碼像這樣(注意括號的位置):

where (  is_cancelled is null 
      and hike_date > DATE_ADD(NOW(), INTERVAL -1 DAY) 
      and show_on_home_page = 1 
      and hike_privacy != 3 
     ) 
or  hike_privacy is null 

這是我們想要的東西完全不同,這就是:

where  is_cancelled is null 
     and hike_date > DATE_ADD(NOW(), INTERVAL -1 DAY) 
     and show_on_home_page = 1 
     and (  
        hike_privacy != 3 
       or hike_privacy is null 
      ) 
3

嘗試and (hike_privacy IS NULL OR hike_privacy != 3)

+1

不知道爲什麼有人低估了這一點,ic3b3rg是正確的。空值不小於或大於任何數字或不等於 - 這是缺少值 – Erik 2011-06-07 01:28:39

+1

警告! 「OR」在SQL中優先,所以「或hike_privacy!= 3」將獨立作爲匹配 - 即它將是(除「hike_privacy!= 3」外的整個where子句)或(hike_privacy!= 3) – Bohemian 2011-06-07 01:29:12

+0

@埃裏克我低估了它 - 閱讀我的評論。這基本上是「錯誤的」 – Bohemian 2011-06-07 01:29:51