我正在尝试创建一个表来存储通知设置。在这个表中,通知设置有一个type
, user_id
和options
列。任何具有NULL user_id
FK的行都表示默认设置值,并且用户对其设置所做的任何更改都将与他们的user_id
一起被插入到表中。
我的User#fetchSettings
函数接受要获取的类型数组,如果没有提供类型,则获取所有类型。该函数应该为所请求的每种类型返回一个设置,返回user_id
的行,而不是user_id
为NULL的行。但是,我找不到一种方法来让user_id
设置的行优先于NULL设置的行。
我的查询如下:
select distinct ON (type)
"type",
"options",
"user_id"
from "user_settings"
where
(
"user_settings"."user_id" = '1'
or "user_id" is null
)
and "type" in ('type1', 'type2', 'type3');
按DISTINCT ON ("type")
选择行。当有多行具有相同类型时,这将选择集合的第一行。您可以通过对行进行正确排序来偏爱具有特定user_id
值的行,而不是具有null
值的行:
select distinct ON (type)
"type",
"options",
"user_id"
from "user_settings"
where
(
"user_settings"."user_id" = '1'
or "user_id" is null
)
and "type" in ('type1', 'type2', 'type3')
order by 1, 2, 3 nulls last;
在发布问题后不久就明白了。通过添加order by
子句,我能够在设置了user_ids的行之后放置空。我的新查询是:
select distinct ON (type)
"type",
"description",
"options",
"user_id"
from "user_settings"
where
(
"user_settings"."user_id" = '385'
or "user_id" is null
)
and "type" in (...)
order by "type" asc, "user_id" asc;