MySQL - 條件查詢中 AND 與 OR 聯合使用

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的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章