Det er et tilfælde af relational-division .
Faktiske tabeldefinitioner (standard 1:n-relation, skjult af Ruby ORM) vil være noget som dette:
CREATE TABLE instructor_student (
id serial PRIMARY KEY
name ...
);
CREATE TABLE fees (
id serial PRIMARY KEY
, instructor_student_id integer NOT NULL REFERENCES instructor_student
, course_type ...
, monthly_detail date
, UNIQUE (instructor_student_id, course_type, monthly_detail)
);
Dit forsøg på en forespørgsel forsøger effektivt at teste hver enkelt række i fees
mod flere værdier i den givne matrix, som altid mislykkes, mens elementer i arrayet ikke er identiske. En værdi kan ikke være det samme som multiple andre værdier. Du har brug for en anden tilgang:
SELECT instructor_student_id
FROM fees
WHERE course_type = ?
AND monthly_detail = ANY(ARRAY[?]::date[]) -- ANY, not ALL!
GROUP BY instructor_student_id
HAVING count(*) = cardinality(ARRAY[?]::date[]);
Dette forudsætter distinkt værdier i dit array og unikke poster i dine bordgebyrer som håndhævet af UNIQUE
begrænsning jeg tilføjede ovenfor. Ellers er tællinger ikke pålidelige, og du skal bruge en mere sofistikeret forespørgsel. Her er et arsenal af muligheder:
Som du kan se, involverede jeg ikke tabellen instructor_student
overhovedet. Mens referentiel integritet håndhæves med en FK-begrænsning (som det typisk er), kan vi arbejde med fees
alene for at bestemme kvalificerende instructor_student_id
. Hvis du har brug for at hente flere attributter fra hovedtabellen, skal du gøre det i et andet trin, f.eks.:
SELECT i.* -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;