多列的条件排序

时间:2012-07-21 19:51:20

标签: mysql ruby-on-rails-3

我有一个Post模型和一个View模型(用户记录每个帖子的视图),如下所示:

class View < ActiveRecord::Base
    belongs_to :user, :class_name => 'User'
    belongs_to :post, :class_name => 'Post'
    validates_uniqueness_of :user_id, :scope =>:post_id
end

每个帖子都有一个名为“special”的布尔字段。

我想获取具有以下排序条件的所有帖子:

  1. 如果帖子是'特殊'并且当前用户没有查看(比如user_id = 2),那么它应该出现在结果的顶部,内部按id按降序排序。)
  2. 根据帖子的ID字段对所有其他帖子(非特殊和特殊浏览)进行排序。
  3. 无法弄清楚我是否以及如何做到这一点。

    首先,我尝试了以下查询:

    posts = Post.order("(case when special = true then 'special desc, id desc' else 'id desc' end)")
    

    但它表现得很有趣:返回顶部的所有特殊帖子,然后是常规帖子,但ids按升序排序。

    我在这里缺少什么?另外,如何使用具有如此复杂的order by子句的join(for views table)?我试图为此写一个SQL,但也在那里挣扎!给我看一些亮点:)

    P.S我是Rails的新手,还在学习。

1 个答案:

答案 0 :(得分:2)

您发布的代码是,每行计算2个字符串文字中的一个,并根据这个原因排序,这就是您没有得到所需示例的原因。 我做了类似

的事情
Post.order('special desc, id desc')

由于rails在MySQL中将布尔字段存储为0/1,因此将在非特殊帖子之前对特殊帖子进行排序。

为此添加视图并不会改变很多:您需要离开加入视图表并执行类似

的操作
Post.joins('left join views on posts.id=post_id and user_id=2').order(' ( views.id is null && special)  desc, id desc')

is null检测是否找到了一个视图,然后使用帖子的特殊性来查看该视图。