Как использовать оператор OR в MySQL при использовании оператора поиска LIKE - PullRequest
1 голос
/ 07 октября 2010

Я пытаюсь создать хороший небольшой оператор поиска, который ищет несколько полей, используя различные условия поиска в зависимости от того, что возвращается.Я в основном устанавливаю порядок, в котором я хочу искать, если один критерий поиска не найден, попробуйте следующий.Однако я использую предложение WHERE для отдельного поиска только одного типа данных.В настоящее время я получаю некоторые странные результаты, потому что я не думаю, что мой порядок правильный, кажется, что мое предложение WHERE игнорируется.

вот мое утверждение (я использую PHP):

mysql_query("SELECT * FROM item AS i LEFT JOIN country AS c ON i.country_id = c.country_id WHERE i.item_status = 'active' AND (i.item_name LIKE '%".$_SESSION['item']."%') OR i.item_description LIKE '%".$_SESSION['description']."%' OR i.item_name LIKE '%".$_SESSION['description']."%' "); 

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 07 октября 2010

Почему вы не используете функцию полнотекстового поиска?

Необходимо изменить структуру таблицы для создания индекса полнотекстового поиска.

ALTER TABLE item ADD FULLTEXT (item_name, item_description);

Тогда ваши запросы превращаются в:

mysql_query("
SELECT * FROM item AS i LEFT JOIN country AS c ON i.country_id = c.country_id 
WHERE i.item_status = 'active' AND 
MATCH (i.item_name, i.item_description)
AGAINST (" . $_SESSION['item'] . " " . $_SESSION['description'] . ");
");

Просто, точно и быстрее.

1 голос
/ 07 октября 2010

Переместите правую скобку в конец оператора:

SELECT * 
FROM item AS i LEFT JOIN country AS c 
ON i.country_id = c.country_id 
WHERE i.item_status = 'active' 
AND (i.item_name LIKE '%".$_SESSION['item']."%' 
OR i.item_description LIKE '%".$_SESSION['description']."%' 
OR i.item_name LIKE '%".$_SESSION['description']."%')
1 голос
/ 07 октября 2010

Это твои скобки не в том месте.Вот правильный код:

mysql_query("SELECT * FROM item AS i LEFT JOIN country AS c ON i.country_id = c.country_id WHERE i.item_status = 'active' AND (i.item_name LIKE '%".$_SESSION['item']."%' OR i.item_description LIKE '%".$_SESSION['description']."%' OR i.item_name LIKE '%".$_SESSION['description']."%')");
0 голосов
/ 07 октября 2010

Оператор OR имеет более низкий приоритет, чем оператор AND.http://dev.mysql.com/doc/refman/4.1/en/operator-precedence.html

Поместите все OR в круглые скобки (один содержит все из них, а не один для каждого из них;)).

...