我有以下架构:
Freelancers
===========
Id
Availabilities
===========
Date
available (bool)
freelancer_id
GeneralAvailabilities
===========
Date
available (bool)
freelancer_id
我希望获得在给定日期有空的所有自由职业者。如果满足以下任一条件,则可以成为自由职业者
- 他们没有
Availability
或GeneralAvailability
在那一天 - 他们有一个
GeneralAvailability
在那个有available
的日期设置为真 - 他们有一个
Availability
在那个有available
的日期设置为真。
如果他们有一个 Availability
设置为 false 但 GeneralAvailability
设置为真,自由职业者可用,如果 availabile
Availability
的值设置为真。
换句话说,要查看自由职业者在给定日期是否有空,请检查 Availability
的 bool 值对于那个日期,如果没有 Availability
对于那个日期,检查 GeneralAvailability
的 bool 值那个日期。如果没有Availability
或 GeneralAvailability
在该日期,它们默认可用。
到目前为止,我的 SQL WHERE 语句如下:
WHERE (
( availabilities.id IS NULL )
OR NOT (
availabilities.date = ?
AND
availabilities.available = false
)
) OR (
( general_availabilities.id IS NULL )
OR NOT (
general_availabilities.weekday = ?
AND
general_availabilities.available = false
)
)
这适用于大多数情况,除非存在 Availability
。那是错误的,并且是 GeneralAvailability
那是真实的。在这种情况下不应返回自由职业者,因为 Availability
应该取代 GeneralAvailability
并且只求助于 GeneralAvailability
如果没有Availability
那个日期。
希望这是有道理的!非常感谢您花时间查看我的问题。
乔希
最佳答案
使用日期左连接到可用性表,然后在“有一个真实的”之前根据“没有成功连接”进行过滤
select
freelancers.id
from
freelancers
left join availabilities on(
availabilities.freelancer_id = freelancers.id
and availabilities.date = '2017.09.28'::date
)
left join general_availabilities on(
general_availabilities.freelancer_id = freelancers.id
and general_availabilities.date = '2017.09.28'::date
)
where
(
availabilities is null
and general_availabilities is null
)
or availabilities.available = true
or (
availabilities is null
and general_availabilities.available = true
)
关于sql - 如何运行有条件地使用连接的连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46469066/