首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >最快的方式,通过匹配,有许多通过关联?

最快的方式,通过匹配,有许多通过关联?
EN

Stack Overflow用户
提问于 2012-01-26 18:13:35
回答 2查看 278关注 0票数 1

当使用有多个关联来管理一系列标记时,根据所选标签的数量对集合进行排序/排序的最有效方法是什么。

例如:

ProductTags

  • When
  • 产品可以有多个标签,用户可以选择标签,我想根据每个产品所选择的标签数量来订购产品。

在这种情况下,是否可以使用cache_counter或类似的东西?我不认为使用sort是最好的选择。我是否正确地认为在实际数据库上使用order通常比sort更快?

澄清/更新

如果上面的内容混淆了,很抱歉。基本上,我所追求的是更接近排序的相关性。例如,用户可能选择标记1、2和4。如果产品具有与其相关的所有树标记,我希望该产品先列出。第二个产品可能只有标签1和4,依此类推。我几乎可以肯定,这将不得不使用sortorder,但我想知道是否有人找到了一种更有效的方法。

EN

回答 2

Stack Overflow用户

发布于 2012-01-27 10:15:13

与Ruby中的排序方法相比,根据数据库中的相关性进行排序是可能的,也是更有效的。假设以下模型结构和适当的底层SQL表结构:

代码语言:javascript
运行
AI代码解释
复制
class Product < ActiveRecord::Base
  has_many :product_taggings
  has_many :product_tags, :through => :product_taggings
end

class ProductTags < ActiveRecord::Base
  has_many :product_taggings
  has_many :products, :through => :product_taggings
end

class ProductTaggings < ActiveRecord::Base
  belongs_to :product
  belongs_to :product_tags
end

查询MySQL中的相关性如下所示:

代码语言:javascript
运行
AI代码解释
复制
SELECT
  `product_id`
  ,COUNT(*) AS relevance
FROM
  `product_taggings` AS ptj
LEFT JOIN
  `products` AS p
    ON p.`id` = ptj.`product_id`
LEFT JOIN
  `product_tags` AS pt
    ON pt.`id` = ptj.`product_tag_id`
WHERE
  pt.`name` IN ('Tag 1', 'Tag 2')
GROUP BY
  `product_id`

如果我有下列产品和相关标签:

代码语言:javascript
运行
AI代码解释
复制
Product 1 -> Tag 3
Product 2 -> Tag 1, Tag 2
Product 3 -> Tag 1, Tag 3

那么上面的WHERE条款应该会使我感到震惊:

代码语言:javascript
运行
AI代码解释
复制
product_id | relevance
----------------------
         2 |         2
         3 |         1

* Product 1 is not included since there were no matches.
  Given that the user is performing a filtered search,
  this behavior is probably fine.  There's a way to get
  Product 1 into the results with 0 relevance if
  necessary.

您所做的就是创建一个很好的小结果集,它可以充当一种内联连接表。为了在products表中的每一行查询上添加相关性评分,请将此查询用作子查询,如下所示:

代码语言:javascript
运行
AI代码解释
复制
SELECT *
FROM
  `products` AS p
  ,(SELECT
      `product_id`
      ,COUNT(*) AS relevance
    FROM
      `product_taggings` AS ptj
    LEFT JOIN
      `products` AS p
        ON p.`id` = ptj.`product_id`
    LEFT JOIN
      `product_tags` AS pt
        ON pt.`id` = ptj.`product_tag_id`
    WHERE
      pt.`name` IN ('Tag 1', 'Tag 2')
    GROUP BY `product_id`
  ) AS r
WHERE
  p.`id` = r.`product_id`
ORDER BY
  r.`relevance` DESC

您将得到一个结果集,其中包含来自您的products表的字段和后面的一个附加的相关性列,然后在ORDER BY子句中使用该列。

您将需要编写一个方法,该方法将使用所需的pt.name IN列表填充该查询。在将列表插入查询之前,一定要对列表中的进行净化,否则您将打开可能的注入。

获取查询组装方法的结果,并通过Product.find_by_sql(my_relevance_sql)运行它,直接从DB中按相关性对模型进行预排序。

明显的缺点是,您在Rails代码中引入了一个特定于DBMS的依赖项(如果您不小心的话,就会面临SQL注入的风险)。如果不使用MySQL,则可能需要调整语法。但是,它的执行速度应该比在结果上使用Rubysort快得多,特别是在一个庞大的结果集中。此外,如果需要,添加LIMIT子句将为您提供分页支持。

票数 0
EN

Stack Overflow用户

发布于 2012-12-03 14:01:28

基于Ryan的出色回答,我想要一种可以使用acts-as-taggable-on和类似插件(称为tags/taggings的表)的方法,最后得到如下结果:

代码语言:javascript
运行
AI代码解释
复制
def Product.find_by_tag_list(tag_list)
  tag_list_sql = "'" + tag_list.join("','") + "'"
  Product.find_by_sql("SELECT * FROM products, (SELECT taggable_id, COUNT(*) AS relevance FROM taggings LEFT JOIN tags ON tags.id = taggings.tag_id WHERE tags.name IN (" + tag_list_sql + ") GROUP BY taggable_id) AS r WHERE products.id = r.taggable_id ORDER BY r.relevance DESC;")
end

为了获得相关产品的列表,我可以这样做:

代码语言:javascript
运行
AI代码解释
复制
Product.find_by_tag_list(my_product.tag_list)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9028190

复制
相关文章
创建水平滚动的正确方式【CSS 网格布局】
自从奈飞 Netflix 成为了家喻户晓的名字以来,在移动端中我们一直使用横向布局。水平滚动容器(列表)已经成为了一种常见的布局做法,而不是将东西都堆叠在页面上,这将减少占用小屏幕设备垂直的空间。
Jimmy_is_jimmy
2022/11/22
2.6K0
创建水平滚动的正确方式【CSS 网格布局】
创建可移动的stack小部件
本文主要介绍我为桌面和 Web 设计的一个超级秘密 Flutter 项目使用了画布和可拖动节点界面。本教程将展示我如何使用堆栈来使用小部件完成可拖动功能
玖柒的小窝
2021/10/05
4930
创建可移动的stack小部件
Python中动态创建类的方法
在Python中,类也是作为一种对象存在的,因此可以在运行时动态创建类,这也是Python灵活性的一种体现。
drunkdream
2018/08/02
5.2K5
Python中动态创建类的方法
在Python中,类也是作为一种对象存在的,因此可以在运行时动态创建类,这也是Python灵活性的一种体现。
drunkdream
2018/08/03
3.6K0
WordPress更新失败?正确更新方式——小文’s blog
用WordPress写博客的各位朋友一定遇到过后台面板更新失败的尴尬情况吧!但是有苦于旧版本有漏洞,怎么办? 今天就给大家带来正确的更新方式 升级前的准备: 备份全站,包括数据库,出问题了博主不负责0.0 禁用所有插件再升级 正式开始: 第一步:替换 WordPress 文件 获取最新版本的 WordPress。将其下载或解压到本地机器,也可以直接下载到服务器。 删除旧的wp-includes文件夹和wp-admin文件夹 将新的WordPress文件复制到服务器上,覆盖根目录下的原有文件,除了wp-co
神无月
2018/06/25
6.6K0
python中的热更新或动态加载
遍览网络中关于动态加载模块的文章,发现有两种方法,一种是用守护进程的方法,一种是用python自带的reload函数。
py3study
2020/01/08
1.3K0
Excel小技巧41:在Word中创建对Excel表的动态链接
Office套件之间协作配合非常方便。例如,我们可以在Word中放置一个来自Excel的表,并且可以随着Excel中该表的数据变化而动态更新。这需要在Word中创建一个对Excel表的动态链接,允许Word文档自动获取Excel表的变化并更新数据。
fanjy
2020/07/02
4.3K0
IDEA中创建和启动SpringBoot应用的正确姿势
默认情况下,当IDEA检查到你的项目中有SpringBoot应用时,会提示你开启,如果你没开启,可以用以下方法开启。
macrozheng
2019/09/26
3.3K0
IDEA中创建和启动SpringBoot应用的正确姿势
Android中动态更新ListView
在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中。 实现步骤:调用ListView的setOnScrollListener()方法设置滑动监听器,实现OnScrollListener接口的方法,判断当列表滑动到最低端时,加载新的列表项。 其中OnScrollListener接口需要实现如下两个方法: onScroll(AbsListView view, int firstVisibleItem, int
欢醉
2018/01/22
2K0
用于创建树形部件的 jQuery 插件:jsTree
jsTree 是一个基于 jQuery 和 Sarissa 的免费网页树形部件,它设置灵活,并且支持几乎主流的浏览器,如:Internet Explorer 6 +, Mozilla Firefox, Safari 3, Opera 9+, Google Chrome。
Denis
2023/04/14
1K0
VBA中动态数组的定义及创建
大家好,今日我们继续讲解VBA数组与字典解决方案的第19讲:动态数组的定义及创建。在VBA中,数组可分为固定数组和动态数组,也称为静态数组和动态数组。我们之前所定义的数组,都是静态数组。静态数组的特点是具有大小的数组。当我们事先知道数组的大小,我们可以直接声明为静态数组。固定数组定义方法:DIM 数组名(<下届>TO<上届>)。
用户8870853
2021/07/27
3.5K0
LeetCode 5270. 网格中的最小路径代价(动态规划)
给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 m * n - 1 的不同整数组成。 你可以在此矩阵中,从一个单元格移动到 下一行 的任何其他单元格。如果你位于单元格 (x, y) ,且满足 x < m - 1 ,你可以移动到 (x + 1, 0), (x + 1, 1), ..., (x + 1, n - 1) 中的任何一个单元格。注意: 在最后一行中的单元格不能触发移动。
Michael阿明
2022/06/13
5510
LeetCode 5270. 网格中的最小路径代价(动态规划)
如何在Mac上的软件更新中隐藏MacOS Catalina更新提示
有好多小伙伴不愿意升级到MacOS Catalina,但是电脑上有系统更新的红点,那么怎么去除呢,下面教大家如何在Mac上的软件更新中隐藏MacOS Catalina,Mac取消系统更新的红点。
MAC先森
2019/10/21
5.4K0
常见Linux命令的正确打开姿势 实践笔记 更新中
常见Linux命令的正确打开姿势 实践笔记 更新中 我使用centos7X64最小化安装 CentOS-7-x86_64-Minimal-1708 1.vim: 1.vim中跳到第一行和最后一行 1.底线命令模式 2.命令模式 2.vim中清空内容 1.底线命令模式 2.命令模式 2.解压war包 1.jar 解压 war包,直接解压到当前目录 2.unzip 解压 war包,带参数-d 解压到test目录下 3.解压缩.tar.gz使用 1.压缩 test.java文件为test.tar.gz
cookily
2020/09/11
1.6K0
如何在Oozie中创建有依赖的WorkFlow
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github: https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 在使用Hue创建WorkFlow时,单个WorkFlow中可以添加多个模块的依赖,使各个模块之间在WorkFlow内产生依赖关系,如果对于一个WorkFlow被其它多个WorkFlow依赖(如:AWorkFlow执行成功后,BWorkFlow和CWorkFlow依赖AWorkFl
Fayson
2018/07/12
6.5K2
Excel小技巧42:创建自动更新的图片数据
可以使用Excel内置的“照相机”功能,来创建自动更新的图片数据。如下图1所示,当工作表单元格区域B2:C6中的数据改变时,右侧文本框中图片的数据会自动更新。
fanjy
2020/07/07
1.2K0
如何在mpvue中正确的引用小程序的原生自定义组件
最近,很多人给我留言,问我说怎么在mpvue项目中引入小程序原生框架中的自定义组件。
一斤代码
2018/09/26
1.8K0
[android] fragment的动态创建
在一个商业软件中,会有很多的界面,如果没一个界面对应一个activity,那么activity会非常的多,清单文件也会非常的乱,谷歌在android3.0以后引入了新的概念叫fragment
唯一Chat
2019/09/10
2.1K0
iOS单例的正确创建
#import "CoolObject.h" @implementation CoolObject +(id)shareInstance { static CoolObject *instance = nil; static dispatch_once_t token; dispatch_once(&token, ^{ // 必须使用super防止循环调用 self和CoolObject一样都会导致循环调用 instance = [[super all
用户6094182
2021/03/05
4430
点击加载更多

相似问题

在android中创建动态网格(如视图)

10

pyqt:动态更新动态创建的小部件的属性

11

更新/刷新动态创建的WxPython小部件

20

Kivy:在更新函数中操纵动态创建的小部件

27

如何在kivy中动态创建小部件?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文