2011-03-14 61 views
1

这是我当前的查询MySQL,最快捷的方式选择一个短语作为单独的单词?

WHERE Keywords.Word = '$search' 

但如果$search这只能是一个字,如果两个或三个词,那么它不会发现任何东西作为我的关键字表字场只有每记录一个字。

最快的方法是什么?

+0

的'$'表示你直接在你的SQL语句中插入值。您的代码可能容易受到[SQL注入](http://unixwiz.net/techtips/sql-injection.html)的影响,这是一个非常严重的[安全风险](http://bobby-tables.com/)。防止注入的最好方法是使用准备好的语句(尽管它们仅通过简单的值来帮助注入;其他部分的语句,如表和列名称,以及复合值通常仍需要插值),您的数据库访问提供者应该支持。如果没有,则使用过时的DA提供程序。 – outis 2011-03-14 08:17:36

+0

谢谢你,我使用'$ search = mysql_real_escape_string($ search);'我希望是足够好的 – Jules 2011-03-14 09:12:38

+0

转义工作,但很容易忘记,这不是准备好的语句的问题。另外,如果您多次执行相同的查询,则预处理语句更具性能。 – outis 2011-03-14 20:35:23

回答

1

取决于你的编程语言,拆分搜索项到一个数组中,并使用IN条款:

WHERE Keywords.Word IN ('$search[0]','$search[1]',...) 
+0

嗯,我很困惑,我会认为它会匹配其他人的第一件作品。我使用的第一个单词在数据库中是独一无二的,第二个单词是一个非常流行的单词。它没有显示出第一份工作的结果。有什么我可以做的改进呢? – Jules 2011-03-14 09:06:59

0

我会根据搜索条件创建虚拟表,并根据表列添加联接。

喜欢的东西

SELECT * 
FROM table t 
     LEFT JOIN (SELECT 'term1' AS name 
      UNION 
      SELECT 'term2' AS name 
      UNION 
      SELECT 'term3' AS name) f 
     ON f.name = w.Word 
WHERE (f.name IS NOT NULL) 
GROUP by t.id 

在这种情况下,你会动态地构建虚拟表中的值静态硬编码值(term1,2,3),你需要在以下几列添加索引

  1. (字)
  2. 假设你有主键id
+0

w是什么?什么是'f'? – 2011-03-14 08:25:56

+0

好问题Andriy – Jules 2011-03-14 09:11:55

+0

我已经更新了答案。 – Pentium10 2011-03-14 10:57:52