我正在使用Sequel gem连接到我的Postgres数据库 - 我有播放列表和曲目,它们有很多关系。
我很难绕过最有效的方式来查询播放列表中看到的前10个最常见的曲目。有人能给我一个如何解决这个问题的例子吗?
答案 0 :(得分:0)
可能最好将模型用于连接表:
class PlaylistTrack < Sequel::Model(:playlists_tracks)
many_to_one :playlist
many_to_one :track
def self.top10_tracks
group_and_count(:track_id).
reverse(:count).
limit(10).
eager(:track).
all.
map(&:track)
end
end
请注意,这会执行两次查询,但会确保生成的曲目数组按受欢迎程度排序。
如果您愿意,可以在没有连接表模型的单个查询中执行此操作:
def Track.top10
join(:playlists_tracks, :track_id=>:id).
group{tracks[:id]}.
select_all(:tracks).
select_append{count(tracks[:id])}.
order{count(tracks[:id]).desc}.
limit(10).
all
end
请注意,这使用非标准SQL,因为它选择了非分组的非聚合表达式,但它在PostgreSQL中有效。通过对track表中的所有列进行分组,您可以使用标准SQL。