我正在开发一个分类广告网站。为了搜索产品或公司,我在正面和背面都使用通配符(%)。
$keyword = "%".$user_keyword."%";
我正在使用以下 mysql 查询:
$query = "SELECT DISTINCT login.id_user,
login.company,
login.district,
FROM login LEFT JOIN products
ON login.id_user = products.id_user
WHERE (login.district LIKE ?
AND login.place LIKE ?)
AND
(login.company LIKE ?
OR login.summary LIKE ?
OR products.description LIKE ?)
LIMIT ?, ?";
";
这是有效的。但是我想参考关键字对列表进行排序。例如:如果用户搜索"foo",可能会得到以下结果:
fool
kafoo
safoora
foo
foolan
我想得到"foo"作为第一项
请尝试以下操作:
$query = "SELECT DISTINCT login.id_user,
login.company,
login.district,
FROM login LEFT JOIN products
ON login.id_user = products.id_user
WHERE (login.district LIKE ?
AND login.place LIKE ?)
AND
(login.company LIKE ?
OR login.summary LIKE ?
OR products.description LIKE ?)
order by if(LOCATE('$user_keyword', login.district)=0, 9999, LOCATE('$user_keyword', login.district))+
if(LOCATE('$user_keyword', login.place)=0, 9999, LOCATE('$user_keyword', login.place))+
if(LOCATE('$user_keyword', login.company)=0, 9999, LOCATE('$user_keyword', login.company))+
if(LOCATE('$user_keyword', login.summary)=0, 9999, LOCATE('$user_keyword', login.summary))+
if(LOCATE('$user_keyword', products.description)=0, 9999, LOCATE('$user_keyword', products.description))
LIMIT ?, ?";
";
如果您只需要完全匹配在结果中显示为第一个,那么您应该在查询中添加类似以下内容:
[...]
ORDER BY
CASE
WHEN checked_column = 'keyword' THEN 1 /* exact match */
ELSE 2 /* non-exact match */
END,
checked_column /* sort non-exact matches */
但是,如果您需要更复杂的排序,例如对结果进行评分以反映它们与给定关键字的相似程度,那么您正在寻找的概念称为编辑距离。