在rails 3中的多对多表中查找最新且唯一的条目

时间:2011-01-20 21:59:51

标签: sql ruby-on-rails ruby ruby-on-rails-3 activerecord

我一直在试用Rails一个月了。我真的很享受! 但是我遇到了一个问题,希望有人可以帮助我!

我的数据库很简单,有3个表:
用户(id,Name)
User_status_code(id,status_code_id,user_id,timestamps)
status_code(id,description)(状态为:1 =已创建,2 =有效,3 =无效,4 =已删除)

User表与status_code通过user_status_code具有多对多关系。

如何查找status_id = 3(非活动)但不是status_id = 4(已删除)的所有用户?

如何根据user_status_code表中的'created_at'获取具有最新status_id的用户的明确列表?

实施例: 在user_status_code中,我有7个条目,有3个用户:

Id,user_id,status_code_id,created_at
1,1,1,15-12-2010
2,1,1,16-12-2010
3,2,1,15-12-2010
4,3,1,17-12-2010
5,3,2,20-12-2010
6,3,3,21-12-2010
7,3,4,22-12-2010

如何显示所有用户的最新状态?

这就是我想要的:
2,1,1,16-12-2010
3,2,1,15-12-2010
7,3,4,22-12-2010

(抱歉我的英文) /基督教

1 个答案:

答案 0 :(得分:0)

问题1

我确信使用某种左外连接有一个更漂亮的方法,但这似乎适用于子查询:

SELECT DISTINCT user_id
FROM user_status_codes
WHERE status_code_id = 3 AND user_id NOT IN
  (SELECT DISTINCT user_id
   FROM user_status_codes
   WHERE status_code_id = 4)

问题2

这是groupwise aggregate

的示例

同样,这可能是一种更清洁,更快速的方法,但试试这个:

SELECT user_id, status_code_id, created_at
FROM user_status_codes t1
WHERE created_at =
  (SELECT MAX(created_at)
   FROM user_status_codes t2
   WHERE t1.user_id = t2.user_id)

将这两个查询映射到各自的AR对象应该是一件小事。