我正在使用标记系统对项目进行分组。基本上我将一些标签添加到项目中然后我可以通过在数据库中搜索包含部分或全部标签的其他项目来查找与其类似的项目,然后按每个项目的最大标签数量排序结果。这里有一些伪代码:
product: id, name, description
tags: id, name
product_tags: id, product_id, tag_id
map = new Map<int product_id, int occurances>
loop product_tags.where(tag_id: [1,2,3]) as |ptag|
map[ptag.product_id]++
end
sort map by max occurrences
return map.top(6)
我的问题是;如何创建单个mysql查询来执行此任务?我也愿意采用其他方法来实现这一目标。
答案 0 :(得分:0)
您想要产品ID吗?
我会选择这样的东西:
product_ids = ProductTag
.joins("INNER JOIN product ON products.id = product_tags.product_id")
.where("tag_id IN (?)", [1,2,3])
.select("product_id, count(product_id) as product_count")
.group("product_id")
.order("product_count DESC")
.limit(6)
.map(&:product_id)
然后,如果您需要产品,可以这样做:
Product.find(product_ids)