【发布时间】:2014-02-15 14:26:50
【问题描述】:
我在选择两张不同用户的随机照片时遇到了麻烦......如果你能帮助我,那就太棒了:)
所以,假设我自己的 user_id=1。我们也不需要那个。
表格看起来像这样:
|----------------------------|
| id | user_id | url | score |
|----------------------------|
| 1 | 1 | A | 15 |
| 2 | 1 | B | 5 |
| 3 | 2 | C | 1 |
| 4 | 2 | D | 51 |
| 5 | 2 | E | 2 |
| 6 | 2 | F | 9 |
| 7 | 3 | G | 7 |
| 8 | 3 | H | 3 |
| 9 | 3 | I | 88 |
| 10 | 4 | J | 15 |
| 11 | 4 | K | 0 |
| .. | ... | .. | ... |
|----------------------------|
因此,由于我是用户 1,因此我不必获取 user_id=1 的行。
我需要另外两个用户的两个随机行。而且这些行也不能属于同一用户。简而言之 - 不是我,也不是其他 2 个相同的用户。
例如
| 5 | 2 | E | 2 |
| 8 | 3 | H | 3 |
or
| 8 | 3 | H | 3 |
| 11 | 4 | K | 0 |
or
| 10 | 4 | J | 15 |
| 3 | 2 | C | 1 |
SQL 查询就可以了。但是如果你可以在 Ruby on Rails ActiveRecord 结构中提供它,那就太酷了。
编辑:
我尝试过的:
@photos = Photo.order('RANDOM()').where.not(:user_id => current_user.id).limit(2).uniq(:user_id)
@photos = Photo.order('RANDOM()').where.not(:user_id => current_user.id).limit(2).distinct(:user_id)
@photos = Photo.distinct(:user_id).random(2)
@photos = Photo.uniq(:user_id).random(2)
附: random() 来自 gem "randumb"。我认为影响不大。
编辑 2:
这行得通
@photos = []
@photo1 = Photo.order('RANDOM()').where.not(:user_id => current_user.id).first
@photo2 = Photo.order('RANDOM()').where.not(:user_id => current_user.id, :user_id => @photo1.user_id).first
@photos << @photo1 << @photo2
【问题讨论】:
-
在您的查询中,您可以尝试执行 SELECT DISTINCT 并随机排序以检索随机记录:davidwalsh.name/mysql-random
-
我稍微编辑了问题
-
您的问题的症状是什么?您是没有取回所需的数据,还是遇到了某种错误?
-
问题是我有时会得到两行相同的用户。 (更好地想象原因:这是摄影比赛。同一用户的照片不能竞争。只能与其他用户的照片竞争。用户也不能为自己的照片投票):)
-
Photo.order('RANDOM()').select(:user_id).distinct.where.not(user_id: current_user.id) 这样试试,我觉得需要指定select所以它可以知道必须使用哪个字段,否则它将使用表 id,当然,对于所有情况都是不同的。
标签: ruby-on-rails ruby activerecord