Как искать в столбце, используя ключевое слово подстановки, где значения столбцов имеют более одного слова - PullRequest
0 голосов
/ 21 марта 2012

Я создал панель поиска для своего веб-сайта, пользователь может искать определенную категорию, мужчину или женщину и т. Д., Выбрав эту опцию в раскрывающемся меню, а затем введя ключевое слово, которое выполняет поиск по выбору. Все названия продуктов состоят из нескольких слов, например, Ultracool Aero Vest или Cyclone Jacket и т. Д. *

Это мой запрос, переменная $ term является переданным ключевым словом:

$query = "SELECT * FROM PRODUCTS WHERE CATALOGUEID = (SELECT CATALOGUEID FROM PRODUCT_CATALOGUE WHERE PRODUCT_NAME LIKE '%" . $term . "%') AND category1 = 1  ";

Теперь это работает, но мне нужно ввести полное название продукта, чтобы он что-то нашел, я ломаю голову, пытаясь понять, как разрешить пользователю выполнять поиск, вводя только одно слово, например, жакет или жилет. Я исследовал это и экспериментировал с регулярными выражениями и подстановочными знаками, но я не добился успеха, я не уверен, возможно ли это вообще. Сайт школ W3 показывает примеры того, как искать части некоторых слов, но не несколько слов. Любой совет приветствуется.

Я редактирую свой вопрос, так как должен сообщить всем, что я использую SQL Server 2008 и не могу использовать любой синтаксис MySQL. Я постоянно забываю, что мне нужно различать это при публикации вопросов, касающихся SQL. Извинения.

Ответы [ 3 ]

0 голосов
/ 21 марта 2012

Я не уверен в этом, но я думаю, что ваше предложение like работает нормально. Попробуйте только этот запрос в вашем клиенте mysql:

SELECT CATALOGUEID FROM PRODUCT_CATALOGUE WHERE PRODUCT_NAME LIKE '%" . $term . "%'

(вы должны использовать то же ключевое слово, что и ранее) У вас есть более одного результата? Если это так, возможно, проблема в том, что вы должны использовать объединение вместо подзапроса или IN вместо "=".

SELECT PRODUCTS.* FROM PRODUCTS JOIN PRODUCT_CATALOGUE using(CATALOGID) where PRODUCT_CATALOGUE.name like "%'.mysql_real_escape_string($term).'%";

(да, кстати, для безопасности добавьте "mysql_real_escape_string")

0 голосов
/ 22 марта 2012

Мне удалось выяснить, как это сделать в конце концов, все время моя проблема заключалась в использовании = вместо IN, вот этот запрос теперь работает отлично, заметьте, я больше не объединяю подстановочный знак с ключевым словом:

$query = "SELECT * FROM PRODUCTS WHERE CATALOGUEID IN (SELECT CATALOGUEID FROM PRODUCT_CATALOGUE WHERE PRODUCT_NAME LIKE '%?%') AND category1 = 1  ";

Спасибо за ваш вклад и помощь в этом.

0 голосов
/ 21 марта 2012

Подход, который я выбрал бы:

  • используйте explode, чтобы разбить строку на
  • Выполните цикл по результирующему массиву, чтобы создать отдельное предложение where для каждого элемента в массиве, WHERE PRODUCT_NAME LIKE '%" . $term[n] . "%') OR ... etc

Это не очень сложно с точки зрения соответствия, но должно найти вас каждое слово в поиске по нескольким словам.

...