Как я могу искать что-то конкретное с другими переменными, используя PHP / MySQL? - PullRequest
0 голосов
/ 17 июня 2011

Я создаю поиск веб-сайта для организации, которая работает с животными, подвергшимися насилию и безнадзорности, и все работает нормально, пока поиск не содержит определенного значения. Например, если кто-то наберет «черный текст» в поле поиска, он будет правильно искать эти термины и правильно отображать результаты. Однако, если они используют расширенный поиск и выбирают «Самец», результаты возвращаются с животными мужского и женского пола, как будто эта часть не имеет значения.

Вот пример SQL-выражения, полученного в результате поиска 'braxton black' и выбора 'Female' в качестве пола животных:

SELECT * FROM ans WHERE (ans_name LIKE '%braxton%' OR ans_name LIKE '%black%') OR (ans_color LIKE '%braxton%' OR ans_color LIKE '%black%') OR (ans_age LIKE '%braxton%' OR ans_age LIKE '%black%') OR (ans_desc LIKE '%braxton%' OR ans_desc LIKE '%black%') AND ans_sex = 'Female' GROUP BY ans_id

Все поля являются правильными, и термин в поле ans_sex является либо мужским, либо женским, поэтому он ищет точный термин. Может кто-нибудь увидеть какие-либо проблемы с этим оператором SQL, который вызывает проблему? Любая помощь с благодарностью.

Ответы [ 4 ]

2 голосов
/ 17 июня 2011

Я не уверен в порядке, в котором mysql обрабатывает условия, но я бы попытался заключить все OR операторы в скобки:

SELECT * FROM ans WHERE ( (ans_name LIKE '%braxton%' OR ans_name LIKE '%black%') OR (ans_color LIKE '%braxton%' OR ans_color LIKE '%black%') OR (ans_age LIKE '%braxton%' OR ans_age LIKE '%black%') OR (ans_desc LIKE '%braxton%' OR ans_desc LIKE '%black%') ) AND ans_sex = 'Female' GROUP BY ans_id
1 голос
/ 17 июня 2011

Вам необходимо понять приоритет оператора И против ИЛИ.

 a or b and c == a or (b and c)

Кроме того, лайки стоят дорого, поэтому сначала нужно проверить пол.

SELECT * FROM ans
WHERE ans_sex = 'Female' AND (
        ans_name LIKE '%braxton%' OR ans_name LIKE '%black%'
        OR ans_color LIKE '%braxton%' OR ans_color LIKE '%black%'
        OR ans_age LIKE '%braxton%' OR ans_age LIKE '%black%'
        OR ans_desc LIKE '%braxton%' OR ans_desc LIKE '%black%'
      )
GROUP BY ans_id
0 голосов
/ 17 июня 2011

Прямо сейчас ваш поиск выполняется следующим образом (я разделю его на маленькие куски для лучшего обзора).

SELECT * FROM ans WHERE (ans_name LIKE '%braxton%' OR ans_name LIKE '%black%')

SELECT * FROM ans WHERE (ans_color LIKE '%braxton%' OR ans_color LIKE '%black%')

SELECT * FROM ans WHERE (ans_age LIKE '%braxton%' OR ans_age LIKE '%black%')

SELECT * FROM ans WHERE ans_age LIKE '%black%'

SELECT * FROM ans WHERE (ans_desc LIKE '%braxton%' OR ans_desc LIKE '%black%') AND ans_sex = 'Female'

Как видите, ваш AND учитывается только с последними OR

Итак ... сделай так:

`SELECT * FROM ans WHERE ((ans_name LIKE '%braxton%' OR ans_name LIKE '%black%') OR (ans_color LIKE '%braxton%' OR ans_color LIKE '%black%') OR (ans_age LIKE '%braxton%' OR ans_age LIKE '%black%') OR (ans_desc LIKE '%braxton%' OR ans_desc LIKE '%black%')) AND ans_sex = 'Female' GROUP BY ans_id

Просто заверните в скобки все до вашего AND

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

Поддерживает ли используемая вами база данных какой-либо вид полнотекстового движка? Производительность будет выше, чем у таблиц, которые потребуются операторам LIKE.

В зависимости от вашей БД, изменения в вашем SQL могут быть минимальными. К сожалению, также могут быть дополнительные расходы.

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