mysql php 模糊搜索 排序
已经用mysql 的 union 实现了一个,但是效率太差,请教论坛上的高人有没有更好的方法。
回复讨论(解决方案) 将你的表结构贴和sql贴出来
本帖最后由 xuzuning 于 2013-02-23 10:18:55 编辑
sql:
(select a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` from `phpcms_ask` a left join `phpcms_ask_posts` b on a.`askid`=b.`askid` where (a.status=3 or a.status=5) and (locate('中国北京天安门',a.`title`)>0) and b.`isask`=1)union (select a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` from `phpcms_ask` a left join `phpcms_ask_posts` b on a.`askid`=b.`askid` where (a.status=3 or a.status=5) and (locate('中国',a.`title`)>0 and locate('北京',a.`title`)>0 and locate('天安门',a.`title`)>0) and b.`isask`=1) union (select a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` from `phpcms_ask` a left join `phpcms_ask_posts` b on a.`askid`=b.`askid` where (a.status=3 or a.status=5) and (locate('中国',a.`title`)>0 and locate('北京',a.`title`)>0) and b.`isask`=1)union(select a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` from `phpcms_ask` a left join `phpcms_ask_posts` b on a.`askid`=b.`askid` where (a.status=3 or a.status=5) and (locate('北京',a.`title`)>0 and locate('天安门',a.`title`)>0) and b.`isask`=1)union(select a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` from `phpcms_ask` a left join `phpcms_ask_posts` b on a.`askid`=b.`askid` where (a.status=3 or a.status=5) and (locate('中国',a.`title`)>0 or locate('北京',a.`title`)>0 or locate('天安门',a.`title`)>0) and b.`isask`=1)limit 0,20
phpcms_ask表: askid catid title tags reward userid username addtime endtime status flag answercount anonymity hits ischeck
phpcms_ask_posts表:pid askid isask message addtime reply rptime candidate optimal reversion userid status anonymity username
既然你不需要计算出现的次数,那么合起来不是更好
select a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` from `phpcms_ask` a left join `phpcms_ask_posts` b on a.`askid`=b.`askid` where (a.status=3 or a.status=5) and b.`isask`=1 and (locate('中国',a.`title`)>0 or locate('北京',a.`title`)>0 or locate('天安门',a.`title`)>0)
若要计算匹配度,也只需
select sign(locate('中国',a.`title`))+sign(locate('北京',a.`title`))+sign(locate('天安门',a.`title`)) as 匹配数 from ...
既然你不需要计算出现的次数,那么合起来不是更好
sql code?123select a.`askid`,a.`catid`,a.`title`,a.`status`,a.`addtime`,a.`reward`,a.`answercount`,b.`message` from `phpcms_ask` a left join `phpcms_ask_posts` b……
感谢版主,您的方法非常有效!!现在速度快了很多。
匹配度排序该如何实现呢
若要计算匹配度,也只需
select sign(locate('中国',a.`title`))+sign(locate('北京',a.`title`))+sign(locate('天安门',a.`title`)) as 匹配数 from ...
版主 请问:按指定的字在字段中出?的次?排序 该如何实现呢? 只在一个字段中查询