我正在建立一个成员搜索引擎,其中有一个文本字段和三个名为interest_1,interest_2和interest_3的sql列。假设其中一个成员的列占用了不同的单词interest_1 = cat,interest_2 = dog,interest_3 = fish。我希望搜索引擎允许用户在文本字段中键入(例如)cat,单击搜索按钮,它会检查并显示那些在interest_1,interest_2或interest_3中包含单词cat的人的结果(这意味着一个人可以拥有interest_1 = cat而另一个人拥有interest_3 = cat并且它们都出现在搜索结果中)。
因此我尝试进行此查询:
mysql_query("SELECT * FROM search_table WHERE
something LIKE '{$something}%'
&& (interest LIKE '{$interest_1}%' OR interest LIKE '{$interest_2}%' OR interest LIKE '{$interest_3}%')
&& (interest_2 LIKE '{$interest_1}%' OR interest_2 LIKE '{$interest_2}%' OR interest_2 LIKE '{$interest_3}%')
&& (interest_3 LIKE '{$interest_1}%' OR interest_3 LIKE '{$interest_2}%' OR interest_3 LIKE '{$interest_3}%')
&& something LIKE '{$something}%'
;");
当人们使用其他文本框搜索其他内容并将兴趣字段留空时,搜索引擎会成功过滤结果。但是,如果有人试图输入并搜索兴趣文本字段,则数据库中的每个成员都会显示(没有任何内容被过滤)。
我检查过它,查询对我来说似乎合乎逻辑,所以我怀疑这是一个语法错误。但是我可能错了,语法是正确的,但我对这个的逻辑是错误的。任何人都可以告诉我问题是什么以及如何修复此查询?
答案 0 :(得分:0)
当{$something}
为空时,查询将返回所有记录。所以先检查一下是否为空。如果没有,请使用LIKE
进行过滤。
对WHERE
子句中的每个条件使用此逻辑:
({$something}='' OR something LIKE '{$something}%')
或强>
({$something} IS NULL OR something LIKE '{$something}%')
<强>解释强>
如果在WHERE
子句中添加了此条件,则仅当LIKE
不为空或空时,它才会使用{$something}
过滤记录。
答案 1 :(得分:0)
我非常确定您想要的逻辑是or
而不是and
这三个利益:
where something LIKE '{$something}%' and
(interest LIKE '{$interest_1}%' OR interest LIKE '{$interest_2}%' OR interest LIKE '{$interest_3}%') or
interest_2 LIKE '{$interest_1}%' OR interest_2 LIKE '{$interest_2}%' OR interest_2 LIKE '{$interest_3}%' or
interest_3 LIKE '{$interest_1}%' OR interest_3 LIKE '{$interest_2}%' OR interest_3 LIKE '{$interest_3}%'
) and
something LIKE '{$something}%';
名为interest
,interest_2
和interest_3
的三个列不太可能 all 以相同的兴趣值开头。而且,对于阅读SQL的人来说,AND
比&&
更受欢迎。 (虽然MySQL确实支持两者,但AND
是ANSI标准并且被所有数据库使用。)
而且,在提到列时,在多列中重复使用相同的实体(&#34;兴趣&#34;)通常是数据库设计不佳的标志。你可能应该有一个联结/关联表,每个方面和兴趣都有一行。