SQL-запрос не хочет работать - PullRequest
1 голос
/ 01 июня 2011

Я знаю, что этот SQL-запрос неверен, или я что-то упустил, но у меня есть таблица, полная сообщений. Я хочу получить все сообщения, где идентификатор пользователя - эфир 1 или 2, а response_to - 0. Но с моим запросом SQL он показывает ответы, а не сообщения от пользователя 2.

Вот мой SQL

SELECT *
FROM `msg`
WHERE
  `userid` LIKE '1'
  OR
  `user_id` LIKE '2' AND `reply_to` LIKE '0'
ORDER BY `timestamp` DESC
LIMIT 0,10; 

Как мне исправить мой запрос, чтобы выполнить то, что я хочу?

Ответы [ 7 ]

4 голосов
/ 01 июня 2011

как насчет этого?:

SELECT * FROM `msg` 
    WHERE `userid` in ('1','2') AND `reply_to`='0' 
    ORDER BY `timestamp` DESC LIMIT 0,10; 
3 голосов
/ 01 июня 2011

У вас есть условие, которое говорит:

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.

1 голос
/ 01 июня 2011

TRY

SELECT * FROM `msg` 
        WHERE `userid` IN (1,2) AND `reply_to`='0' 
        ORDER BY `timestamp` 
        DESC LIMIT 0,10; 
0 голосов
/ 01 июня 2011

В зависимости от того, что вы на самом деле ищете в своем условном выражении, вы можете либо:

SELECT * FROM `msg` 
WHERE (`userid` IN ('1','2'))
  AND (`reply_to` = '0')
ORDER BY `timestamp` DESC
LIMIT 0, 10;

... или:

SELECT * FROM `msg` 
WHERE (`userid` = '1')
   OR (
         (`userid` = '2') 
     AND (`reply_to` = '0')
   )
ORDER BY `timestamp` DESC
LIMIT 0, 10;
0 голосов
/ 01 июня 2011

Вам нужно использовать круглые скобки (я предполагаю, что они работают в mysql, как они делают в mssql), чтобы помочь ему узнать, какие условия условия where приемлемы.

SELECT *FROM `msg`
WHERE  (`userid` LIKE '1'  
OR  `user_id` LIKE '2') 
AND `reply_to` LIKE '0'
ORDER BY `timestamp` 
DESCLIMIT 0,10; 
0 голосов
/ 01 июня 2011

Попробуйте:

SELECT * 
FROM `msg` 
WHERE (`userid` = '1' OR `user_id` = '2') 
AND `reply_to` = '0' 
ORDER BY `timestamp` DESC LIMIT 0,10;

Скобки - важный бит. Вы должны использовать = вместо Like, когда вы не ищете подстановочные знаки.

Вы также можете использовать in для проверки user_id.

0 голосов
/ 01 июня 2011

Мне кажется, что вам нужно добавить скобки к вашему предложению WHERE, чтобы гарантировать, что последовательность выполнения частей OR и AND соответствует вашему желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...