希望改进搜索查询的mysql select语句:
Select * from table WHERE ( user = '$search_query'
OR user LIKE '$search_query %'
OR keyword LIKE '$search_query'
OR tag LIKE '$search_query'
OR tag LIKE '% $search_query'
OR tag LIKE '% $search_query%'
OR tag LIKE '$search_query%'
OR REPLACE(question, ',' ,'') LIKE '$search_query %'
OR REPLACE(question, ',' ,'') LIKE '% $search_query'
OR REPLACE(question, ',' ,'') LIKE '% $search_query %'
OR REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(question, '\'', ''), ',', ''), '.',''), ':',''), ';',''), '!',''), '?','') LIKE '%$search_query%'
)
它之所以破碎的原因,是因为如果有人搜索“艺术”,我不希望它也显示“心脏”的结果。
我确实需要具有相同的功能,但运行的资源更少。
答案 0 :(得分:4)
如果您的表格为MyISAM
,则可以在其上创建FULLTEXT
索引:
CREATE FULLTEXT INDEX fx_mytable_user_tag_question ON mytable (user, tag, question)
SELECT *
FROM mytable
WHERE MATCH(user, tag, question) AGAINST ('+some*' IN BOOLEAN MODE)
此查询将返回some
和something
,但不会返回awesome
。
实际上,第一步(创建索引)不是必需的,但是,它会加快查询速度并允许更复杂的搜索(不限于BOOLEAN MODE
)和相关性范围。
默认情况下,搜索查询的最小长度为4
个字符,因此无法找到示例中提到的art
。
要解决此问题,您必须在服务器设置中更改参数ft_min_word_len
。
答案 1 :(得分:1)
看起来像是
OR tag LIKE '$search_query'
OR tag LIKE '$search_query%'
会将相同的结果返回到仅运行
OR tag LIKE '$search_query%'
与
相同OR tag LIKE '% $search_query'
OR tag LIKE '% $search_query%'
搜索这个问题,我了解到MySQL支持regular expression searches。使用这些,如果您能够指定%
应匹配的模式。这对所有那些讨厌的空间都有帮助,因为你可以使用\s?
。
答案 2 :(得分:0)
重构数据库,使标记存储在单独的表中,问题上的每个标记都有一行,以便您可以运行如下查询:
SELECT * FROM question
WHERE question_id IN (
SELECT question_id FROM question_tags WHERE tag = '$search_query'
) OR <...>
根据您希望搜索关键字的工作方式,您可以在那里使用类似的解决方案。