最好的办法是什么?
我有列:track_name,artist_name,album_name
我希望所有列都与搜索查询匹配。匹配时有一定的灵活性。
mysql就像是太严格了,即使是%XXX%。它匹配字符串作为一个整体,而不是部分。
答案 0 :(得分:2)
您的MySQL查询可能有多个OR
子句,搜索用户输入的每个以空格分隔的单词。例如,用户搜索“Stone of the Stoneage”可能会在SQL中表示为SELECT * FROM songs WHERE artist_name LIKE "%Queens%" OR artist_name LIKE "Stoneage"
。
但是,这可能是不受欢迎的,因为以LIKE
开头的%
搜索效率低,而且在大型数据库上速度非常慢。
虽然我不能谈论性能影响,但你应该看看natural language full-text searches。它可能是您找到的最有效的解决方案:
SELECT * FROM songs WHERE MATCH(track_name, artist_name, album_name) AGAINST('Queens of the Stoneage' IN NATURAL LANGUAGE MODE);
确实存在一些用于确定文本字符串相似性的PHP函数,但是在数据库中保持这种工作可能是最有效的(而且不那么令人沮丧):
答案 1 :(得分:0)
我认为您需要重新考虑您的申请。我从您的评论中理解的是,您需要在程序中实现一些逻辑运算符,如“和”,“或”和“不”。它不仅仅是像全文索引这样的花哨算法,也不是像这个mysql匹配查询那样最长的常见子串。但我错了。