2016-12-24 4 views
1

오케이 제목이 최고는 아니지만이 질문을하는 다른 방법을 모르겠다. ...Postgres는 엔트리의 관련 테이블 수를 기준으로 필터링하는 방법이 있습니까?

나는 Postgres와 함께 Sequel gem을 사용하고있다. 재생 목록과 트랙이있는 데이터베이스가 있으며 특정 속성으로 트랙을 필터링했습니다 (트랙의 하위 집합이 있습니다).

그런 다음 재생 목록을 트랙의 하위 집합이 포함 된 항목으로 필터링하려면 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을 사용하고 filtered_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 문을 "역변환"할 수 있는지 여부 또는 확실하지 않습니다. 난 정말 Sequel을 사용하여 어디에서 SELECT를 추가할지 모르겠다. 그러나 필요한 경우 Sequel을 사용하면 사용자 지정 SQL을 직접 사용할 수 있으므로 실제로 SQL 문을 작성하고 실행할 수 있음을 항상 활용할 수 있습니다.