如何使用PHP / MySQL搜索特定于其他变量的内容?

时间:2011-06-16 22:36:36

标签: php mysql search

我正在为一个与受虐待和被忽视的动物合作的组织创建一个网站搜索,一切正常,直到搜索包含特定值。例如,如果有人在搜索字段中键入“braxton black”,它将正确搜索这些字词,并正确显示结果。但是,如果他们使用高级搜索,他们选择“男性”,结果会回来的是雄性和雌性动物,就像那部分无关紧要。

以下是搜索'braxton black'并选择'Female'作为动物性别时产生的示例SQL语句:

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 个答案:

答案 0 :(得分:2)

我不确定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 :(得分:1)

您需要了解运算符优先级AND vs OR。

 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

答案 2 :(得分:0)

您使用的数据库是否支持某种全文引擎?性能将优于LIKE运算符所需的表格。

根据您的数据库,您对SQL的更改可能会很小。不幸的是,可能还有额外的费用。

答案 3 :(得分:0)

现在,您的搜索会像这样执行(我会将其拆分为小块以便更好地进行概述)。

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

之前将所有内容括起来