在MySQL DB字段中搜索多个文本

时间:2012-05-25 16:01:21

标签: php mysql search

我目前有以下内容将搜索我的数据库中的字段以提及一个单词,但是想知道如果客户输入两个单词,而不是仅输出与该特定格式匹配的任何内容,它实际上将单词拆分并返回两个单词的结果不完全匹配:

目前有

   WHERE title LIKE '%SEARCH TEXT HERE%'..

因此,如果用户当前输入“FISH”或“FISH FOOD”,那么它将仅返回其中包含该文本的列。

我想要发生的是,如果他们输入了多个单词,那么它实际上会将其拆分,然后搜索并返回所有单独单词的结果。

所以'FISH FOOD'将返回所有带有鱼或食物的行,而不仅仅是与'FISH FOOD'匹配的任何东西

使用PHP和MySQL

由于

4 个答案:

答案 0 :(得分:2)

您需要分解关键字字符串并执行以下查询:

WHERE title LIKE '%SEARCH%' OR title LIKE '%TEXT%' OR title LIKE '%HERE%'..

虽然更复杂,但如果您了解全文的学习曲线,我会同意bpgergo的回答。它具有许多优点,简单" LIKE"查询。考虑一下:

SELECT * FROM article WHERE title like '%BIO%'

这将返回"生物学"," BIOgraphy"等等。全文理解词边界,以便这些"挑战"是地址。此外,您可以使用匹配的相关性,并在排序结果时使用它。

它还考虑"停止"单词,所以如果用户输入" Food for my fish",它仍然只能匹配" Food"和"鱼"因为"对于"和"我的"是可以省略的常用词。

答案 1 :(得分:1)

将搜索字符串拆分为多个部分(explode(“”,$ string))。 然后为每个部分添加条件标题LIKE“%$ part%'或title LIKE”%$ part%'或...

答案 2 :(得分:1)

感谢@Greg P,@ ErikFWinter和@bpgergo对我当时正在研究这种方法的回复,最好将我的答案添加到未来的参考中:

  $search = explode(' ', $title);
    $searchResults = 'LIKE ';
    foreach ($search as $id => $word) {
        $searchResults .= "'%" . $word . "%'";
        $searchResults .= " OR title LIKE ";
    }
    $searchResults = rtrim($searchResults," OR title LIKE ");

    return $this->db->select("SELECT videoid, title, formatloc FROM db_vList WHERE title {$searchResults} order by title asc");

可能有一个更容易的原因,但学习是非常感激的。

的Si

答案 3 :(得分:0)

你需要什么先生是MySQL的FULLTEXT索引。

这是一个详细的例子,可以满足您的需求。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

编辑这是纯粹的SQL解决方案。

为方便起见,我在这里复制了相关的SQL:

CREATE TABLE articles (
d INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
ENGINE=MyISAM;

INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When configured properly, MySQL ...');

SELECT id, body, MATCH (title,body) AGAINST
('Security implications of running MySQL as root') AS score
FROM articles WHERE MATCH (title,body) AGAINST
('Security implications of running MySQL as root');