2016-12-24 5 views
1

Хорошо, что название было не самым лучшим, но я не знаю, как еще спросить об этом ...Есть ли у Postgres способ фильтрации по счету связанной таблицы?

Я использую камень Sequel с Postgres. У меня есть база данных с плейлистами и треками, и я отфильтровал треки по определенному атрибуту (так что у меня есть подмножество треков).

Я использую Playlists.where(tracks: filtered_tracks) для фильтрации плейлистов до тех, которые содержат подмножество треков.

Однако можно ли только плейлисты, у которых есть два или более трека из подмножества треков? Скажем, что-то вроде Playlists.where(tracks: filtered_tracks, at_least: 2).

ответ

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, и если ваш filter_tracks будет «track a», «track b» и «track 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 может быть «переведен обратно» в «Продолжить». Я не уверен. Я действительно не знаю, как добавить SELECT в WHERE, используя Sequel. Однако вы всегда можете воспользоваться тем фактом, что в случае необходимости Sequel позволит вам напрямую использовать собственный SQL-код, что означает, что вы действительно можете написать инструкцию SQL и выполнить ее.

Смежные вопросы