Sql 根据最大匹配条件对筛选的项目进行排序

Sql 根据最大匹配条件对筛选的项目进行排序,sql,ruby-on-rails,sorting,Sql,Ruby On Rails,Sorting,在MyRails webapp中,用户可以应用多个过滤器进行搜索。我希望筛选的项目按大多数匹配条件进行排序 例如:如果用户搜索带有动力转向、电动车窗和中控锁的汽车。结果项必须按以下顺序排序: 所有匹配条件 两个条件匹配 单条件匹配 在rails中执行此操作的标准方式是什么 我通过编写三个不同的查询来完成上述工作。一个一个。然后加入他们。随着搜索选项的增加,这似乎效率很低 提前谢谢。我认为在这种情况下,最好放弃ActiveRecord,使用直接SQL以获得更好的性能 您可以使用此查询在单个查询中检

在MyRails webapp中,用户可以应用多个过滤器进行搜索。我希望筛选的项目按大多数匹配条件进行排序

例如:如果用户搜索带有动力转向、电动车窗和中控锁的汽车。结果项必须按以下顺序排序:

  • 所有匹配条件
  • 两个条件匹配
  • 单条件匹配
  • 在rails中执行此操作的标准方式是什么

    我通过编写三个不同的查询来完成上述工作。一个一个。然后加入他们。随着搜索选项的增加,这似乎效率很低


    提前谢谢。

    我认为在这种情况下,最好放弃ActiveRecord,使用直接SQL以获得更好的性能

    您可以使用此查询在单个查询中检索和排序结果:

    SELECT * FROM 
       (SELECT
            *,
            (CASE WHEN condition1 THEN 1 ELSE 0) + 
            (CASE WHEN condition2 THEN 1 ELSE 0) +
            (CASE WHEN condition3 THEN 1 ELSE 0) as filterCount
        FROM cars 
        WHERE condition1
        OR condition2
        OR condition3) 
    ORDER BY filterCount DESC
    

    我认为在这些情况下,最好放弃ActiveRecord,使用直接SQL来获得更好的性能

    您可以使用此查询在单个查询中检索和排序结果:

    SELECT * FROM 
       (SELECT
            *,
            (CASE WHEN condition1 THEN 1 ELSE 0) + 
            (CASE WHEN condition2 THEN 1 ELSE 0) +
            (CASE WHEN condition3 THEN 1 ELSE 0) as filterCount
        FROM cars 
        WHERE condition1
        OR condition2
        OR condition3) 
    ORDER BY filterCount DESC
    

    嘿,您可以使用您可以编写的查询来尝试这些方法

    在查询中使用条件子句查找给定匹配条件的匹配项,然后按给定计数对给定记录排序

    ModelName.select("*,((CASE WHEN (condition1) THEN 1 ELSE 0 END) + (CASE WHEN (condition2) THEN 1 ELSE 0 END)+( CASE WHEN (condition3) THEN 1 ELSE 0 END)) as match_occurance").where("condition1 or condition2 or condition3").order("match_occurance desc")
    

    嘿,您可以使用您可以编写的查询来尝试这些方法

    在查询中使用条件子句查找给定匹配条件的匹配项,然后按给定计数对给定记录排序

    ModelName.select("*,((CASE WHEN (condition1) THEN 1 ELSE 0 END) + (CASE WHEN (condition2) THEN 1 ELSE 0 END)+( CASE WHEN (condition3) THEN 1 ELSE 0 END)) as match_occurance").where("condition1 or condition2 or condition3").order("match_occurance desc")
    

    “乏味”这个词并不合适:你只需要写一次代码,你需要试着把它做好。您并不是每次有人执行查询时都编写代码。“低效”,也许——这将是重点关注的问题。对。谢谢你@MaxWilliams的“乏味”一词并不恰当:您只需编写一次代码,您需要尝试正确地完成它。您并不是每次有人执行查询时都编写代码。“低效”,也许——这将是重点关注的问题。对。谢谢你@麦克斯威廉姆斯