【问题标题】:How to select random rows with distinct user (ActiveRecord)如何选择具有不同用户的随机行(ActiveRecord)
【发布时间】: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


【解决方案1】:

首先,这将为您提供给定用户的随机图片

Photo.where("user_id = ?",<USER_ID>).shuffle.first

现在您需要 2 个不同的用户,它们不是当前用户

Photo.select("distinct user_id").where("user_id <> ?",<CURRENT_USER>).shuffle.first(2)

现在一切尽在掌握

@photos = []
unique_user_cnt = 2
Photo.select("distinct user_id").where("user_id <> ?",<CURRENT_USER>).shuffle.first(unique_user_cnt).each do |p|
  @photos << Photo.where("user_id = ?",p.user_id).shuffle.first
end

【讨论】:

  • 看起来这种方法允许使用尽可能多的不同照片。我去看看,谢谢
猜你喜欢
  • 1970-01-01
  • 2013-03-11
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 2019-08-17
  • 1970-01-01
相关资源
最近更新 更多