LIKE / OR SQL查询,语法错误或错误逻辑?

时间:2014-05-18 14:23:36

标签: sql search logic syntax-error search-engine

我正在建立一个成员搜索引擎,其中有一个文本字段和三个名为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}%'
;");

当人们使用其他文本框搜索其他内容并将兴趣字段留空时,搜索引擎会成功过滤结果。但是,如果有人试图输入并搜索兴趣文本字段,则数据库中的每个成员都会显示(没有任何内容被过滤)。

我检查过它,查询对我来说似乎合乎逻辑,所以我怀疑这是一个语法错误。但是我可能错了,语法是正确的,但我对这个的逻辑是错误的。任何人都可以告诉我问题是什么以及如何修复此查询?

2 个答案:

答案 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}%';

名为interestinterest_2interest_3的三个列不太可能 all 以相同的兴趣值开头。而且,对于阅读SQL的人来说,AND&&更受欢迎。 (虽然MySQL确实支持两者,但AND是ANSI标准并且被所有数据库使用。)

而且,在提到列时,在多列中重复使用相同的实体(&#34;兴趣&#34;)通常是数据库设计不佳的标志。你可能应该有一个联结/关联表,每个方面和兴趣都有一行。