Mysql выберите заявление

0

Мне нужен правильный способ написать простой оператор WHERE, AND, OR. Это не работает:

SELECT `content` 
  FROM `bx_wall_events` 
 WHERE `type` = 'wall_common_text' 
    OR `type` = 'wall_common_fb' 
    OR `type`= 'wall_common_tw' 
   AND `owner_id`='{$iId}' 
ORDER BY `date` DESC 
   LIMIT 1
Теги:

3 ответа

5
Лучший ответ

Это действительное утверждение, но я думаю, что проблема заключается в том, что ORs не интерпретируются так, как вы ожидали. Вместо этого используйте синтаксис IN:

  SELECT content
    FROM bx_wall_events
   WHERE `type` IN ('wall_common_text', 'wall_common_fb', 'wall_common_tw')
     AND `owner_id` = '{$iId}' 
ORDER BY `date` DESC 
   LIMIT 1

Я удалил backticks в определенных местах, потому что они нужны только для экранирования имен таблиц и столбцов, которые используют зарезервированные ключевые слова MySQL.

Как это:

WHERE `type` = 'wall_common_text' 
   OR `type` = 'wall_common_fb' 
   OR `type`= 'wall_common_tw' 
  AND `owner_id`='{$iId}' 

... оценивает:

WHERE (`type` = 'wall_common_text')
   OR (`type` = 'wall_common_fb')
   OR (`type`= 'wall_common_tw' AND `owner_id`='{$iId}')
  • 0
    Вы также можете просто поставить круглые скобки вокруг OR, чтобы отделить их от AND, но я согласен с тем, что именно так можно и поступить.
  • 0
    @ Майкл Мэдсен: Вы можете, но IN более удобен в обслуживании - пропустите или пропустите одну скобку, и запрос может быть действительным, но не вернет правильные данные. Пропустите скобку на IN , и вам гарантирована синтаксическая ошибка.
0

"SELECT content FROM bx_wall_events  WHERE ((type= 'wall_common_text') || (type= 'wall_common_fb') || (type= 'wall_common_tw'))  И owner_id= '{$ iId}' ORDER BY date DESC LIMIT 1 "

  • 2
    Двойные каналы в SQL - это конкатенация строк ...
  • 0
    В MySQL по умолчанию || логический оператор ИЛИ С включенной функцией PIPES_AS_CONCAT || такое конкатенация строк (см. dev.mysql.com/doc/refman/5.1/en/operator-precedence.html )
Показать ещё 2 комментария
0

Обнаружено отличное решение с использованием IN

"SELECT `content` 
FROM `bx_wall_events` 
WHERE `owner_id`='{$iId}' 
AND `type`
IN ('wall_common_text', 'wall_common_fb', 'wall_common_tw') 
ORDER BY `date` 
DESC LIMIT 1"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню