MySql查詢中經常會用到AND與OR一起使用的情況,可如果寫法不對,往往會起到相反的效果,這不,前幾天就碰到了,最後測試果然提了一堆bug~
1、當mysql的WHERE語句中出現AND、OR時,AND 要麼全部放在 OR 的前面,放在OR之後的AND條件將不會起作用,參考sql
SELECT
e.total_amount
FROM
cmo_expense_account e
WHERE
e.project_id='236aec01d88e48cdaaee357a870d18b5'
AND e.ea_type =1
OR (e.project_id in (select t1.id from pm_project t1 where t1.parent_id='236aec01d88e48cdaaee357a870d18b5'))
and e.total_amount>300
- 當然,結果肯定是200的也會出現,如果你把 AND e.ea_type =1再放到後面,naer_type=2的也就出現了
2、如果你怕出錯,可以使用union all寫法。將and與or分開,這樣就不會存在問題了,就是比較麻煩
select sum(t3.total_amount) from (
SELECT
e.total_amount
FROM
cmo_expense_account e
WHERE e.project_id='236aec01d88e48cdaaee357a870d18b5'
AND e.ea_type =1
union ALL
SELECT
e.total_amount
FROM
cmo_expense_account e
WHERE e.project_id in (select t1.id from pm_project t1 where t1.parent_id='236aec01d88e48cdaaee357a870d18b5')
AND e.ea_type =1) t3
3、如果你堅持需要將AND放在OR之後,那麼,OR的兩邊應該用()括起來和AND並列。比如下面這個:
SELECT * from student WHERE id = 1 or id = 2 AND age = 20;
查詢出 id 是 1 或者 2 並且年齡是 20 的,那麼很明顯結果:
上面查詢出來的是id=1的或者id爲2並且年齡20的,如果想取唯一的並集,那麼就需要這麼寫
SELECT * from student WHERE (id = 1 or id = 2 ) AND age = 20;
這樣查出來的纔是id爲1或者2的並且年齡一定是20的!