【问题标题】:Rails, order by number of matched tags and then by nameRails,按匹配标签数量排序,然后按名称排序
【发布时间】:2013-01-14 14:45:24
【问题描述】:

这就是我想做的事情:ListingTagTaggings 之间存在多对多关系。我想让用户通过title(列表)和name(零个或多个标签)搜索列表。我想先按匹配标签数最多的列表排序结果数,然后按标题排序。

这个问题似乎以前已经做过了——它可能就像匹配 MySQL 中的这个问题 (Ordering items with matching tags by number of tags that match) 一样简单。但是,我根本不懂 SQL,这就是我寻求帮助的原因。

更新: 这是我想要的示例。

假设我有 3 个列表。

listing1 有标签“幽默”、“搞笑”和“搞笑”。

listing2 = 2 有标签“有趣”、“愚蠢”和“愚蠢”。

listing3 = 3 有标签“有趣”、“愚蠢”和“愚蠢”。

listing4 = 4 带有“非常严重”的标签。

如果我使用“有趣”和“愚蠢”标签进行搜索,我应该得到的是列表 2、列表 3、列表 1 和列表 4(暂时忽略标题)。

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 has-many-through sql-order-by


    【解决方案1】:

    有趣的问题。我认为您可能必须使用一些 SQL 糖来执行此范围。

    类似这样的:

    Listing
      .joins("LEFT JOIN taggings ON taggings.listing_id = listings.id")
      .joins('LEFT JOIN tags ON tags.id = taggings.tag_id AND tags.name IN ("funny","silly")')
      .group(:id)
      .order("count(tags.id), name DESC")
    

    这有帮助吗?

    【讨论】:

    • 我似乎抛出了异常......也许这与我将 listing_tags 重命名为 taggings 的事实有关——这就是我的连接表的名称。我在上面发布了代码和错误消息,但对我来说发生了什么非常神秘。
    • 没关系!它似乎奏效了。你能解释一下你的答案吗(我不知道发生了什么)?另外,我调整了答案以使其正常工作-引号和在tag_names上使用join存在问题
    • 当然!首先,您需要在 taggings 表上左连接。左连接包括第一个表 listings 中的所有行。这样,您仍然可以检索没有标签的列表。
    • 然后在tags 上执行另一个左连接,规定它们是您要搜索的标签,“有趣”和“愚蠢”。
    • 现在,如果您按列表对连接的查询进行分组备份,您将能够计算与每个列表匹配的标签的 ID,并按其排序。
    【解决方案2】:

    假设您想要一个纯 ActiveRecord 中的解决方案,以免触及任何 SQL...

    Listing.order("tags.count DESC, title")
    

    在这种情况下,您最好使用counter cache 作为标签来优化您的查询。

    【讨论】:

    • 我认为您刚刚给我的内容是根据它们拥有的标签数量对列表进行排序——而不是匹配的标签。这不是我想要的——请参阅更新后的问题。
    • 这比我预期的要复杂得多。我一直在试穿一整天,但还是没有。
    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    相关资源
    最近更新 更多