引言
我有一个项目,我们帮助IT社区组织更好的IT会议(就像meetup.com,但只针对IT社区),称为https://codotto.com/
我们正在开发一个新的特性,在这里我们希望显示某些标签的使用数量。该算法应该像Stackoverflow的算法一样工作。您可以编写javascript,并得到一个具有与查询匹配的标记的列表,这些标记按最常用的查询排序。
我目前正在使用Laravel,但是我将发布原始查询,这样mysql向导可以更容易地帮助我解决问题:)
问题
我有以下表格
标签表
id name
1 javascript
2 javascript-tools
3 javascript-securitygroup_has_tags表
group_id tag_id
1 2
2 2
2 3我们已经使用了两次javascript-tools标记,javascript-security使用了一次,而javascript则完全没有使用。
现在,如果用户搜索javascript,他应该获得第一个javascript (因为它是一个直接匹配的),然后是按其使用情况排序的其余标记。
在Laravel中,这是我拥有的代码(简化的ofc)
$tags = Tag::withCount('groups')
->orderBy('groups_count', 'DESC')
->where('name', 'LIKE', 'javascript%')
->get(2);问题是,由于我只返回2结果,结果中没有包含javascript,即使是用户真正写的结果

对于mysql魔术师,下面是原始查询
select
`tags`.*,
(
select
count(*)
from
`meetups`
inner join `meetup_has_tags` on `meetups`.`id` = `meetup_has_tags`.`meetup_id`
where
`tags`.`id` = `meetup_has_tags`.`tag_id`
) as `meetups_count`
from
`tags`
where
`title` LIKE 'javascript%'
order by
`meetups_count` desc
limit
2 offset 0问题
这里的主要目标是将最相关的结果返回给用户。他写道,javascript和javascript首先出现,其次是“相关”结果。我发现的方法是根据使用标记的次数进行排序。
有什么解决方案可以让我“请先获取与此查询匹配的结果,然后返回最相关的结果”吗?
所谓“最相关”的结果,我只是指“用户正在寻找什么”。如果他写了"javascript“,它应该返回"javascript”和"javascript-tools“(因为"javascript-tools”被使用了两次,但用户实际上是在搜索"javascript")。
发布于 2022-05-20 18:34:25
以下是您的查询:
SELECT * FROM
(SELECT tags.*,COALESCE((SELECT COUNT(*) FROM group_has_tags WHERE tag_id = tags.id),0) AS usage
FROM tags
WHERE title LIKE 'javascript%') AS tmp
ORDER BY tmp.name = 'javascript' DESC,usage DESC对于每个匹配的标记,您将得到使用它的次数。然后,首先根据标签是否与用户输入的内容匹配进行排序,然后根据用法进行排序。当然,您必须将这个查询参数化,但我希望您能够理解。
https://stackoverflow.com/questions/72322482
复制相似问题