php+mysql如何根据匹配率分页返回数据?

新手上路,请多包涵

例如这样一个功能,用户可设置自己的标签,然后其他用户可选择希望匹配到的用户标签,按照匹配率从高到低分页返回用户信息,这样要如何设计表结构,在查询时如何构建查询语句才能分页返回呢?请大佬帮忙解答一下,感激不尽

阅读 1.6k
2 个回答

我先猜测你在小厂,先不管算法好坏,纯粹的只是想实现这么一个逻辑差不多正确的功能

mysql5.7以后支持innodb中文全文索引和中文分词器ngram,那么...

  1. 每个用户冗余一个所有兴趣标签文本字段,比如tags_text,存储文本如"游泳 篮球 羽毛球"
  2. 当某个用户的兴趣标签要匹配的时候,用选择的标签也组成类似的文本"游泳 乒乓球"去匹配搜索

给个例子

表结构

create table users
(
    id int auto_increment primary key,
    tags_text varchar(255) null
);

create fulltext index users_tags_text_index on users (tags_text) with parser ngram;

取匹配度降序的前10个用户

SELECT *,MATCH (tags_text) against ('游泳 乒乓球') as match_degree FROM users
WHERE MATCH (tags_text)
against('游泳 乒乓球') order by match_degree desc limit 10

按你的回复中提供的用例,我测试了下,我觉得可以符合你的需求,结果如下:
image.png

你可以给每个标签都变成0/1字段,然后条件搜索就行了。
比如用户选了篮球、足球、宅,那么select sum(篮球,足球,宅) as real ...,然后按real排序。
速度好不了,呵呵。要是单纯的兴趣和当前用户兴趣一致超过50%这种还有可能空间换时间,你这种够呛。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题