将 or-filter 更改为 and-filter 用于连接 table 的 `column = ANY()` 比较

Change or-filter into and-filter for joined table's `column = ANY()` comparison

所以我有一个 table 个用户和另一个 table 个他们的爱好。我创建了一个这样的查询:

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 列表。

这行得通,但它最终成为一个 "or" 过滤器,根据用户的爱好对 select 用户进行筛选。例如,如果 hobbies = [<football_id>, <basketball_id>],用户有 足球 篮球作为他的爱好就足够了。

我想要的是以上内容,但要求用户拥有 %(hobbies)s 列表中提供的 所有 爱好。我该怎么做?

我建议使用数组

例如比较数组:

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])