2013-05-03 24 views
0

需要從表中獲取特定的行,但查詢返回多行獲取在MySQL查詢正確的行使用AND或

MYSQL

SELECT DISTINCT 
     id, sender_id, msg, name, profilepic, cur_time, cur_date 
    FROM `chat` 
    WHERE 
     (sender_id = '1' AND receiver_id = '3') 
     OR 
     (sender_id = '3' AND receiver_id = '1') 
     AND 
     chat.id > '3' 

表樣本:

id | sender_id | receiver_id | msg | name | profilepic 
1  1    3  hi Jay  o.jpg 
2  1    3  hey Jay  o.jpg 
3  3    1  hi Tom  o.jpg 
4  1    3  Yes Jay  o.jpg 

的我期望從查詢中得到的第四個ID爲「4」,但查詢不斷返回其他幾行

+0

這將是我們更容易幫助你,如果你設置了[SQL小提琴(http://sqlfiddle.com/) – 2013-05-03 13:33:22

+0

它,如果你加入這兩個OR子句周圍括號幫助嗎? 'SELECT ... WHERE((...)OR(...))和chat.id>'3';' – oikku 2013-05-03 13:34:58

+0

如果它是整數爲什麼使用'''? – Shikiryu 2013-05-03 13:36:22

回答

1

ORAND較低的優先級排又一排,所以圍繞在你OR表達圓括號:

WHERE (
    (sender_id = '1' AND receiver_id = '3') 
    OR (sender_id = '3' AND receiver_id = '1') 
) 
    and chat.id > '3' 

考慮原WHERE條款:

WHERE 
    (sender_id = '1' AND receiver_id = '3') 
    OR 
    (sender_id = '3' AND receiver_id = '1') 
    AND 
    chat.id > '3' 

因爲AND優先OR,它將被解釋如下:

(sender_id = '1' AND receiver_id = '3') 

    OR 

    ((sender_id = '3' and receiver_id = '1') AND chat.id > '3') 

我的回答將迫使提出的括號兩個OR表達式一起評估,如下所示:

((sender_id = '1' AND receiver_id = '3') OR (sender_id = '3' and receiver_id = '1')) 

    AND 

    chat.id > '3' 
+0

很好的解釋。 – ankurtr 2013-05-03 13:58:38

+0

非常詳細的解釋。謝謝! – John 2013-05-08 13:54:32

0

試試這個

SELECT DISTINCT id, sender_id, msg, name, profilepic, cur_time, cur_date FROM `chat` WHERE ((
sender_id = '1' AND receiver_id = '3') OR (sender_id = '3' AND receiver_id = '1')) and chat.id > '3' 

原始查詢匹配具有

sender_id = '1' AND receiver_id = '3' 

,並具有

sender_id = '3' AND receiver_id = '1' AND chat.id > '3 
0

問題是你試圖在同一時間來評估這兩個條款:

(sender_id = '3' AND receiver_id = '1') 
AND 
chat.id > '3' 

這將永遠是正確的,必須記住,該與運營商綁定比OR-運營商強大

所以只需添加paranthesis圍繞你的兩個ORs,這應該很好