Postgres是否有办法根据条目的相关表进行过滤?

时间:2016-12-24 23:02:24

标签: ruby postgresql sequel

不可否认,这个头衔不是最好的,但我不知道怎么回答......

我正在使用Postgres的Sequel宝石。我有一个包含播放列表和曲目的数据库,我已经按特定属性过滤了曲目(因此,我有一部分曲目)。

然后我使用Playlists.where(tracks: filtered_tracks)将播放列表过滤到包含曲目子集的播放列表。

但是,是否可以仅从曲目子集中选择具有两个或更多曲目的播放列表?比如Playlists.where(tracks: filtered_tracks, at_least: 2)

1 个答案:

答案 0 :(得分:1)

最终答案的一些指示...

我假设您的表的定义方式与此类似:

CREATE TABLE playlists
(
    playlist_id integer PRIMARY KEY,
    playlist_name text
) ;

CREATE TABLE playlists_x_tracks
(
    playlist_id integer,
    track text,
    PRIMARY KEY (playlist_id, track)
) ;

我们用一些数据填充它们:

INSERT INTO playlists (playlist_id, playlist_name)
VALUES 
    (1, 'list 1'), 
    (2, 'list 2');

INSERT INTO playlists_x_tracks (playlist_id, track) 
VALUES 
    (1, 'track a'), 
    (1, 'track b'), 
    (1, 'track c'),
    (1, 'track d'),
    (2, 'track a'),
    (2, 'track e') ;

使用SQL,并假设您的filtered_tracks将跟踪','跟踪b'并跟踪x'通过执行以下查询,您可以得到所需的答案:

SELECT
    *
FROM
    playlists
WHERE
    (SELECT 
        count(*) 
    FROM
        playlists_x_tracks 
    WHERE
        playlists_x_tracks.playlist_id = playlists.playlist_id
        AND track in ('track a', 'track b', 'track x')
    ) >= 2 ;

此SQL语句如何以及是否可以"反向翻译"续集我不确定。我真的不知道如何使用Sequel在WHERE中添加SELECT。但是,您可以随时利用Sequel将允许您直接使用自定义SQL的事实,这意味着您可以实际编写SQL语句并执行它。