如何查询 many_to_many 与 Sequel gem 和 Postgres 的关联
How to query many_to_many associations with Sequel gem and Postgres
我正在使用 Sequel gem 连接到我的 Postgres 数据库 - 我有播放列表和曲目,它们具有 many_to_many 关系。
我很难找到查询播放列表中出现频率最高的前 10 首曲目的最有效方法。谁能举例说明如何实现这一点?
可能最好使用模型进行连接 table:
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
请注意,这执行了两次查询,但它确保生成的曲目数组按受欢迎程度排序。
如果你愿意,你可以在没有连接的情况下在单个查询中完成 table 模型:
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 中确实有效。通过按轨道 table.
中的所有列分组,您可以使用标准 SQL 进行这项工作
我正在使用 Sequel gem 连接到我的 Postgres 数据库 - 我有播放列表和曲目,它们具有 many_to_many 关系。
我很难找到查询播放列表中出现频率最高的前 10 首曲目的最有效方法。谁能举例说明如何实现这一点?
可能最好使用模型进行连接 table:
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
请注意,这执行了两次查询,但它确保生成的曲目数组按受欢迎程度排序。
如果你愿意,你可以在没有连接的情况下在单个查询中完成 table 模型:
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 中确实有效。通过按轨道 table.
中的所有列分组,您可以使用标准 SQL 进行这项工作