0

我正在为一个与受虐待和被忽视的动物合作的组织创建一个网站搜索,并且在搜索包含特定值之前一切正常。例如,如果有人在搜索字段中输入“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

4 回答 4

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
于 2011-06-16T22:41:49.643 回答
1

您需要了解运算符优先级 AND 与 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
于 2011-06-16T22:45:39.583 回答
0

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

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

于 2011-06-16T22:46:16.337 回答
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

于 2011-06-16T22:46:53.713 回答