У вас есть условие, которое говорит:
user=1 or user=2 and reply_to=0
Если это оценивается как (user=1 or user=2) and reply_to=0
, то вы получите желаемый результат - неотвеченные сообщения, где пользователь является либо user1, либо user2. Однако, если он оценивается как user=1 or (user=2 and reply_to=0)
, он вернет все сообщения user1 и неотвеченные сообщения для user2, поэтому есть некоторая двусмысленность.
Мой совет: Никогда, и я имею в виду никогда , смешайте and
и or
в одном и том же состоянии. Конечно, существуют правила приоритета, которые сообщают вам, что p or q and r
оценивается так или иначе, но они могут быть разными на разных платформах, на разных языках, возможно, даже в разных реализациях. А представь, если бы вместо 3 было 15 условий?
Всегда используйте круглые скобки для разделения и / или блоков. Компилятор или база данных не заботятся о них и не нуждаются в них, но ничтожные человеческие умы работают лучше, когда мы можем представить, что на самом деле компьютер должен делать.
Вы можете переписать ваш запрос как:
SELECT * FROM msg
WHERE (userid=1 OR user_id=2)
AND reply_to = 0
ORDER BY timestamp DESC
где связь между условиями более очевидна.
P.S. Избегайте использования LIKE
, если вы на самом деле не используете подстановочные знаки LIKE
.