将 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])
所以我有一个 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])