我正在尝试制作类似搜索页面的功能。我想查询“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
但它很冗长。有没有更简单或更有效的方法呢?
答案 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%'
读取name
和description
并在应用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,