我有一个表调用对象,其中有列:
object_id,
name_english(vchar),
name_japanese(vchar),
name_french(vchar),
object_description
每个对象。
当用户执行搜索时,他们可能会输入英语,日语或法语......我的sql语句是:
SELECT
o.object_id,
o.name_english,
o.name_japanese,
o.name_french,
o.object_description
FROM
objects AS o
WHERE
o.name_english LIKE CONCAT('%',:search,'%') OR
o.name_japanese LIKE CONCAT('%',:search,'%') OR
o.name_french LIKE CONCAT('%',:search,'%')
ORDER BY
o.name_english, o.name_japanese, o.name_french ASC
有些条目如下:
Tin spoon,
Tin Foil,
Doctor Martin Shoes,
Martini glass,
Cutting board,
Ting Soda.
因此,当用户搜索单词“Tin”时,它将返回这些单词的所有结果,但我只想返回特定包括术语“Tin”的结果或显示结果并按相关性顺序对它们进行排名。我怎样才能做到这一点?
感谢。
答案 0 :(得分:4)
你可以使用MySQL FULLTEXT索引来做到这一点。这需要MyISAM表类型,索引(name_english,name_japanese,name_french,object_description)或您要搜索的任何字段,以及在该列列上恰当使用MATCH ... AGAINST运算符。
请参阅http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html上的手册以及下页http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html
中的示例答案 1 :(得分:1)
运行上面的查询后,您将得到所有类型的结果,包括您不感兴趣的结果,但您可以在上面的结果(由mysql服务器返回)上使用正则表达式来过滤掉您需要的内容。
答案 2 :(得分:0)
这应该可以解决问题 - 您可能需要过滤掉重复项,但基本想法很明显。
SELECT
`object`.`object_id`,
`object`.`name_english`,
`object`.`name_japanese`,
`object`.`name_french`,
`object`.`object_info`, 1 as ranking
FROM `objects` AS `object`
WHERE `object`.`name_english` LIKE CONCAT(:search,'%') OR `object`.`name_japanese` LIKE CONCAT(:search,'%') OR `object`.`name_french` LIKE CONCAT(:search,'%')
union
SELECT
`object`.`object_id`,
`object`.`name_english`,
`object`.`name_japanese`,
`object`.`name_french`,
`object`.`object_info`, 10 as ranking
FROM `objects` AS `object`
WHERE `object`.`name_english` LIKE CONCAT('%',:search,'%') OR `object`.`name_japanese` LIKE CONCAT('%',:search,'%') OR `object`.`name_french` LIKE CONCAT('%',:search,'%')
ORDER BY ranking, `object`.`name_english`, `object`.`name_japanese`, `object`.`name_french` ASC