Мне нужен правильный способ написать простой оператор 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
Это действительное утверждение, но я думаю, что проблема заключается в том, что 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}')
"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 "
Обнаружено отличное решение с использованием 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"
IN
более удобен в обслуживании - пропустите или пропустите одну скобку, и запрос может быть действительным, но не вернет правильные данные. Пропустите скобку наIN
, и вам гарантирована синтаксическая ошибка.