这是我的常规代码,它工作正常:
$sql = 'SELECT '
. '* '
. 'FROM '
. 'item '
. 'WHERE MATCH '
. '(title) '
. 'AGAINST '
. '(:search IN NATURAL LANGUAGE MODE) '
. 'OR MATCH '
. '(description) '
. 'AGAINST '
. '(:search IN NATURAL LANGUAGE MODE) '
. 'ORDER BY '
. 'id ASC';
我想将字段"状态"与字符串"public"进行比较,因为我只需要"公共"条目,我尝试了这样的事情:
$sql = 'SELECT '
. '* '
. 'FROM '
. 'item '
. 'WHERE MATCH '
. '(title) '
. 'AGAINST '
. '(:search IN NATURAL LANGUAGE MODE) '
. 'OR MATCH '
. '(description) '
. 'AGAINST '
. '(:search IN NATURAL LANGUAGE MODE) '
. 'WHERE '
. 'status = "public" '
. 'ORDER BY '
. 'id ASC';
但是对于最后一个"WHERE",结果出乎我的意料。
有什么解决办法吗?
您添加了 2 个 WHERE 语句,这是不允许的,当您使用 OR 时,最好在 OR 条件周围放置括号以确保正确的结果
$sql = 'SELECT *
FROM item
WHERE status = "public"
AND (
MATCH (title) AGAINST (:search IN NATURAL LANGUAGE MODE)
OR MATCH (description) AGAINST (:search IN NATURAL LANGUAGE MODE)
)
ORDER BY id ASC';
查询中有几个错误,
WHERE
子句添加两次-
OR
中的条件应括在圆括号"(("中SELECT * FROM item WHERE ( MATCH (title) AGAINST (:search IN NATURAL LANGUAGE MODE) OR MATCH (description) AGAINST (:search IN NATURAL LANGUAGE MODE) ) AND status = "public" ORDER BY id ASC
此外,使用SELECT *
是有害的。您可以在此处阅读有关它的详细信息