2016-06-28 83 views
-2

幫助我理解爲什麼我得到不同支數SQL查詢(AND和OR)混淆

查詢1

SELECT Count(*) 
FROM `foo` 
WHERE `status_id` = 2 
     AND `updated_at` < Date(Now() - INTERVAL 1 day) 
     AND `number` LIKE 'A390%' 
     OR `number` LIKE 'A391%' 
     OR `number` LIKE 'A392%' 

結果= 20000

查詢2

SELECT Count(*) 
FROM `foo` 
WHERE `status_id` = 2 
     AND `updated_at` < Date(Now() - INTERVAL 1 day) 
     AND (`number` LIKE 'A390%' 
       OR `number` LIKE 'A391%' 
       OR `number` LIKE 'A392%') 

結果= 14967


SELECT Count(*) 
FROM `foo` 
WHERE `status_id` = 2 
     AND `updated_at` < Date(Now() - INTERVAL 1 day) 
     AND `number` LIKE X 

運行的每個(A390,A391,A392)上述查詢分別給我:

'A390%' = 0; 
'A391%' = 1496; 
'A392%' = 10000; 

編輯: 添加屏幕截圖使其更加清晰。我不得不做一些Photoshop來更改表名稱

Query 1

Query 2

Query 3

Query 4

Query 5

+1

沒有理由讓三個單獨查詢的總和小於第二個查詢的結果。看着這些數字,我懷疑你錯誤地輸入了一些東西。 –

+0

第二和第三不能不同 –

+0

我會仔細檢查我的所有號碼 –

回答

0

AND操作符比OR更高的優先級,讓你的第一個查詢等效於:

SELECT Count(*) 
FROM `foo` 
WHERE 
    (`status_id` = 2 
     AND `updated_at` < Date(Now() - INTERVAL 1 day) 
     AND `number` LIKE 'A390%') 
    OR `number` LIKE 'A391%' 
    OR `number` LIKE 'A392%' 

在你的第二個查詢相比之下,條件status_idupdated_at只適用於行number LIKE 'A390%'

如果所有查詢都在相同的數據上執行,則三個單獨查詢的總計數不能小於第二個查詢返回的計數。大概你在某個地方犯了一個錯字。但是,如果有任何行'number s滿足LIKE條件中的一個以上條件,則單個查詢的總數可以是大於

+0

沒有錯別字,我添加了截圖。 –

+0

@ M.ofCA,也許我的眼睛壞了,但我***發誓***你最後三個截圖顯示你的個人查詢結果分別爲0,4967和10000。這些總和爲14967,這正是您從第二次完整查詢中獲得的數量。第二個單獨查詢的結果與您在問題文本中聲明的結果不同(或者我可能失敗的眼睛告訴我)。你還在告訴我沒有錯字嗎? –