1

我想制作一个搜索脚本,我可以在其中搜索多个单词,但脚本会在所有行而不是特定行中找到单词。例如。

  __________________________   ________
 |Cheese                    | | Search |
  ——————————————————————————   ————————

然后我制作了一个 php 脚本,上面写着:

SELECT * FROM table WHERE column1 = "$value" OR column2 = "$value" OR column3 = "$value" ... ;

这将显示单词“Cheese”出现在任何列中的结果。问题是,我希望人们可以同时搜索“奶酪”和“厨房”,但我需要将这些词分开并搜索如下内容:

SELECT * FROM table WHERE column1 = "$value" OR column2 = "$value" OR column3 = "$value" ... AND column1 = "$value2" OR column2 = "$value2" OR column3 = "$value2" 。 .. ;

问题是我真的不知道该怎么做。既不是单词分离,也不是如何在 SQL 数据库中找到单词。我也不知道如何搜索“Cheese”所属的单词……比如“Cheesecake”……

如果有人知道如何制作这个,请帮助我。

谢谢你。

4

5 回答 5

2

您所有的 SQL 需求都是正确的括号:

SELECT *
FROM table
WHERE (column1 = "$value" OR column2 = "$value" OR column3 = "$value") AND
      (column1 = "$value2" OR column2 = "$value2" OR column3 = "$value2")

“AND”在“OR”之前得到评估。

顺便说一句,必须搜索多个列表明您的数据模型可能存在缺陷。您可能需要一个表格结构,将每个单词放在单独的行中。

于 2012-05-07T21:47:10.073 回答
2

你会想看看 MySQL 的全文索引:http ://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

全文索引创建索引列中每个单词的索引(默认要求单词至少为 4 个字符,但这可以在 MySQL ini 文件中更改)。然后,您可以对多个单词进行搜索,包括单词的开头(cheese* 将匹配 cheesecake...但请记住,由于索引是按字母顺序排列的,因此无法使用索引来使“cake”匹配 cheesecake)。这样做的好处是:

  1. 比一系列 AND () OR () 语句快得多
  2. 能够返回相关性索引,因此您知道与所有关键字匹配 5 次的行比具有一个单词一次的行更相关,等等。
于 2012-05-07T21:48:12.770 回答
1

不可能在一个子句中搜索整行。但是,您可以使用 LIKE 子句来搜索像“Cheese”这样的词,并让它们匹配“Cheesecake”。

这将变得比你想象的要复杂得多。我建议研究一下 MySQL 的 MyISAM 全文搜索之类的东西,或者如果您打算使用 Sphinx 之类的东西进行频繁搜索或处理大量数据。此外,如果您确实决定遵循当前路线,那么您正在寻找的是 LIKE 子句。

无论如何,要搜索包含奶酪或蛋糕的单词:

SELECT blah FROM tbl WHERE (col1 LIKE '%cheese%' OR col2 LIKE '%cheese%') AND (col1 LIKE 'cake' OR col2 LIKE 'cake');

虽然这是非常低效的。它不能使用索引,这意味着它需要对每个查询进行全表扫描。

于 2012-05-07T21:48:31.600 回答
1

您在这些查询方面进展顺利。

最明显的缺失是 SQL 中的通配符运算符。这用于匹配部分字符串。例如,这将找到“芝士蛋糕”和“芝士饼干”记录:

SELECT *
FROM table
WHERE column1 = '%cheese%'

处理搜索的更高级方法包括为要搜索的数据编制索引。要么自己做,要么使用第三方或特定的数据库工具。在谷歌中查找这个。

但是,对于没有被大量搜索命中的常规站点,您当前的方法很好。

还有一件事:如果您的问题是关于如何为搜索框中的每个单词自动添加额外的 SQL 行,您将需要了解更多信息。首先在 PHP 官方文档 (php.net) 中查找这些术语,

  • 爆炸
  • 前锋
于 2012-05-07T21:53:38.253 回答
-1

为什么不检索您需要的所有数据并使用字符串函数来存储大海捞针中的搜索项目,我相信 stristr 会对您有所帮助,或者您可以只使用 SQL 查询,但这可能会给您的数据库带来压力。如我错了请纠正我。

于 2012-05-07T21:49:13.050 回答