0

テーブルから特定の行をフェッチする必要があるが、クエリが複数の行を返す

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」の4番目ですが、クエリは他のいくつかの行を返し続けました

4

4 に答える 4

1

ORよりも優先順位が低いため、式を括弧でAND囲みます。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私の回答で提案された括弧は、次のように 2 つの式を一緒に評価することを強制します。

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

  AND

  chat.id > '3'
于 2013-05-03T13:38:32.077 に答える
0

問題は、これら 2 つの句を同時に評価しようとすることです。

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

これは決して真実ではありません。AND 演算子は OR 演算子よりも強く結合することに注意してください。

したがって、2 つの OR の前後に括弧を追加するだけで問題ありません。

于 2013-05-03T13:40:29.350 に答える