2016-05-22 28 views
5
| id | user_id | created_at (datetime) | 
| 1  | 1  | 17 May 2016 10:31:34 | 
| 2  | 1  | 17 May 2016 12:41:54 | 
| 3  | 2  | 18 May 2016 01:13:57 | 
| 4  | 1  | 19 May 2016 07:21:24 | 
| 5  | 2  | 20 May 2016 11:23:21 | 
| 6  | 1  | 21 May 2016 03:41:29 | 

Benzersiz ve en son created_at user_id kayıdı sonucunu nasıl elde edebilirim, bu durum yukarıdaki durumda 5 ve 6 no'lu kayıtlar olacak mı?En son oluşturulan tarihiyle benzersiz kayıt seçin

Table.all.group_by(&:user_id) 

#{1 => [record 1, record 2, record 4, record 6], etc} 

Ve ondan maksimum tarihle kaydını seçin:

ben böyle bir karma dönmek için group_by kullanmaya çalışıyorum şimdiye kadar

Şimdiye kadar denedim ne olacak? Teşekkürler. Gordon cevaba

Güncelleme çözüm

sayesinde, ror ham sql sorgusu kullanmak find_by_sql kullanıyorum.

@table = Table.find_by_sql("Select distinct on (user_id) * 
          From tables 
          Order by user_id, created_at desc") 

#To include eager loading with find_by_sql, we can add this 

ActiveRecord::Associations::Preloader.new.preload(@table, :user) 
+0

noob ama bir fikir denemek olurdu: Model.find (: id) .order (: created_at) .last ama sadece bir user_id için çalışır. Belki gibi pluck ekleyerek: Model.find (: id) .order (: created_at) .uniq.pluck (: user_id) .last – Maxence

+0

Aslında bence işe yaramaz düşünüyorum. belki kullanarak: Model.order (: created_at) .where (: user_id ...). son ve döngü? – Maxence

+0

Teşekkürler! Sonunda benzersiz user_id alabilen “farklı” cevabını seçtim. – pyfl88

cevap

3

Postrgres olarak, DISTINCT ON kullanabilirsiniz:

SELECT DISTINCT ON (user_id) * 
FROM tables 
ORDER BY user_id, created_at DESC; 

Ben Yakut bu nasıl ifade edeceğini emin değilim.

+0

Lütfen yanılıyorsam düzeltin, ama bu MySQL sözdizimi şeklinde ifade edilebilir: 'SELECT created_at FROM tabloları GROUP BY user_id SIPARI tarafından oluşturuldu created_at DESC;' –

+0

Sorun sadece 'created_at' tarafından sipariş veremiyorsunuz Postgres’te 'user_id' ayrıca sıralama anahtarının bir parçası olmalıdır. –

+0

@philpirozhkov. . . Kesinlikle hayır. MySQL hakkında bir sorunuz varsa, bu veritabanındaki cevapları araştırmalı veya kendinize bir soru sormalısınız. –

-2

son kayıt isterseniz: Son 2 kayıtları istiyorsanız

Table.order(:created_at).last 

:

Table.order(:created_at).last(2) 
0

1) Özü benzersiz kullanıcı tablosunu oluşturan

Table.all.uniq(:user_id) 

2) Her kullanıcının tüm kayıtlarını bulun.

Table.all.uniq(:user_id).each {|_user_id| Table.where(user_id: _user_id)} 

3) formunda) son

Table.all.uniq(:user_id).each {|_user_id| Table.where(user_id: _user_id).order(:created_at).last.created_at} 
oluşturulan Dönüş sonucu seçin: [] [kimlik, user_id, [kimlik, user_id] ...]

Table.all.uniq(:user_id).map{|_user_id| [Table.where(user_id: _user_id).order(:created_at).last.id, _user_id]} 

Bu döndürmelidir [[6,1], [2,5]]

+0

'all.uniq' biti, son oluşturulan kayıtlardan kurtulma riski taşımaz mı? – Maxence

+0

@Maxence Cevabı güncelledim. Pyfl88'in her ** user_id için en son oluşturulan_yataya ihtiyaç duyması nedeniyle bu olmayacaktır. Tüm benzersiz user_ids'leri alarak hiçbir şeyi hariç tutmuyorum. Onun örneğinde, yalnızca 2 benzersiz kimlik ** var [1,2] **, ben bu user_id içeren kayıtlar arasında dönüyorum. –

0
Table 
    .select('user_id, MAX(created_at) AS created_at') 
    .group(:user_id) 
    .order('created_at DESC') 

Notçağrısı created_at bildirimi, bir sütun değeri değil, birleştirilmiş işlevin bir sonucu olduğu için dizeyle geçirilir.

İlgili konular