MySQL:在多列中查找相同的字符串

时间:2013-11-30 14:25:03

标签: php mysql sql search

我正在尝试制作类似搜索页面的功能。我想查询“ColumnA”和“ColumnB”以及“ColumnC”和“ColumnD”中的“查询”。并在任何列中选择包含单词/短语“query”的行。 这似乎有效:

   SELECT * FROM projects
   WHERE 
   category LIKE '%query%' OR
   name LIKE '%query%' OR 
   description LIKE '%query%'OR 
   keywords LIKE '%query%' OR 
   'type' LIKE '%query%'  
   ORDER BY name ASC   

但它很冗长。有没有更简单或更有效的方法呢?

2 个答案:

答案 0 :(得分:11)

简单的解决方法:

SELECT * 
FROM projects 
WHERE 
    CONCAT(category,name,description,keywords,type) LIKE '%query%' 
ORDER BY name ASC;

如果需要,您可以在列之间添加分隔符:

SELECT * 
FROM projects 
WHERE 
    CONCAT(category,"|",name,"|",description,"|",keywords,"|",type) LIKE '%query%' 
ORDER BY name ASC;

您还可以使用全文搜索(您需要创建全文索引,如下所述:How do FULLTEXT INDEXES on multiple columns work?

SELECT *, MATCH (category,name,description,keywords,type) AGAINST ('query') AS score FROM projects WHERE MATCH (category,name,description,keywords,type) AGAINST ('query');

答案 1 :(得分:0)

但它很冗长。

我认为这不是问题。查询可以在客户端生成。

是否有更简单或更有效的方法?

使用Sphinx或Solr与MySQL。这并不困难,超级快。这是斯芬克斯的例子。 http://www.ibm.com/developerworks/library/os-php-sphinxsearch/

我认为CONCAT效率不高于你的,连接列会有成本(某些列可能是长文本)。 CONCAT(name, description) LIKE '%query%'读取namedescription并在应用LIKE后连接两个值。这意味着所有列读取两次,而您的查询可以在第一列匹配时完成。所有条件都是“或”,因此category列匹配%query%,该行不需要与'name'列进行比较。

<强> FYI

仅供参考,以下查询可以查看,哪一列有更多'查询'

SELECT name,
  (LENGTH(category) - LENGTH(REPLACE(category, 'query', ''))) / LENGTH('query') as category_match_cnt,
  (LENGTH(name) - LENGTH(REPLACE(name, 'query', ''))) / LENGTH('query') as name_match_cnt,
  (LENGTH(description) - LENGTH(REPLACE(description, 'query', ''))) / LENGTH('query') as desc_match_cnt,