2011-05-13 77 views
1

當我運行以下查詢時,它只顯示1行。基於「created_date」條件,其中,如果我刪除「created_date」條件,只是保持「status_change_date」條件,它顯示3行。提供錯誤結果的SQL查詢

我想查看所有在指定時間內創建或修改的項目。我無法找到什麼錯在查詢周圍的日期條款

`SELECT DISTINCT products.id AS product, status.id AS stat, COUNT(*) AS total FROM items 
     INNER JOIN products ON (items.fk_product_id = products.id) 
     INNER JOIN status ON (items.fk_status = status.id) 
     WHERE DATE(items.status_change_date) BETWEEN '2011-04-13' AND '2011-05-13' 
     OR DATE(items.created_date) BETWEEN '2011-04-13' AND '2011-05-13' 
     AND status.id = 2 
     GROUP BY products.name, status.name order by products.name`

回答

1

你的WHERE子句看起來錯誤,請嘗試:

WHERE 
    (DATE(items.status_change_date) BETWEEN '2011-04-13' AND '2011-05-13' 
    OR DATE(items.created_date) BETWEEN '2011-04-13' AND '2011-05-13') 
     AND status.id = 2 
     GROUP BY products.name, status.name order by products.name 
+0

當我拿走status.id = 2,看它再次1行顯示在整個結果status.id = 2的所有狀態設置 – Johal 2011-05-13 16:59:08

+0

我刪除DISTINCT仍然是相同的 – Johal 2011-05-13 17:07:21

+0

@Johal你是否嘗試在你的where子句中放置parens?您的查詢可能存在其他問題,但您正在執行x OR y AND z而不是(x或y)和z。如果change_date在日期範圍內,或者創建的日期在日期範圍內且狀態ID爲2,那麼您寫入的方式只會返回記錄。我認爲您想要返回更改日期或修改日期的記錄在日期範圍內並且狀態ID是2。 – rsbarro 2011-05-13 18:10:47

1

用括號括起來:

WHERE (DATE(items.status_change_date) BETWEEN '2011-04-13' AND '2011-05-13' 
    OR DATE(items.created_date) BETWEEN '2011-04-13' AND '2011-05-13') 
    AND status.id = 2 
1

我有一種感覺的條件正在evalulated這樣

status_change_date or (created_date and status.id = 2) 

你可能會嘗試使用圓括號來指定您的條件分組

(DATE(items.status_change_date)... OR DATE(items.created_date)...) 
    AND status.id = 2