所以我有一张用户表和另一张爱好表。我创建了一个这样的查询:
SELECT DISTINCT
usr.id,
usr.name,
usr.gender
FROM usr
LEFT JOIN hobby ON hobby.usr_id = usr.id
WHERE %(hobbies)s IS NULL OR hobby.id = ANY(%(hobbies)s)
我通过将值传递给%(hobbies)s
来调用:如果没有提供业余爱好过滤器,则为NULL
,或者用作过滤器的业余爱好ID列表。
这样可行,但它最终成为一个“或”过滤器,根据他们的爱好选择用户。例如,如果hobbies = [<football_id>, <basketball_id>]
,那么用户 或篮球足以作为他的爱好。
我想要的是上述内容,但用户需要所有在%(hobbies)s
列表中提供的爱好。我该怎么做?
答案 0 :(得分:2)
我建议使用数组
例如比较数组:
select array[1,2,3] = array[1,2,3]; // TRUE
select array[1,2,3] = array[1,2,5]; // FALSE
并包含其他数组中的数组:
select ARRAY[1,4,3] @> ARRAY[3,1] // TRUE
select ARRAY[1,4,3] @> ARRAY[1,2,4] // FALSE
您的查询:
SELECT
usr.id,
usr.name,
usr.gender
FROM usr
where (select array(select h.id from hobby h where h.usr_id = usr.id)) @> (select array[1,2,3])