我有一个类似于以下示例的mySQL表:
DOC_OwnerID DOC_type DOC_start_date DOC_end_date
100 JANUARY 1/1/2017 12/31/2018
100 JANUARY 1/1/2018 12/31/2019
100 DRIVER 1/5/2018 1/4/2019
100 LICENSE 2/5/2015 2/5/2016
100 LICENSE 4/5/2018 2/5/2019
200 JANUARY 1/2/2017 1/2/2018
200 DRIVER 1/2/2018 1/2/2019
在我的应用程序逻辑中,我需要找到在给定时间段内拥有三个基本强制性文档(JANUARY,DRIVER,LICENSE)的任何所有者(DOC_OwnerID)。必须显示3才能显示所有者拥有三个文档。 (文档名称在每个时间段都是唯一的)
例如:OwnerID = 100,Date = 4/9/2018
true => 100 JANUARY 1/1/2018 12/31/2019
true => 100 DRIVER 1/5/2018 1/4/2019
true => 100 LICENSE 4/5/2018 2/5/2019
应返回3以显示所有三个文档在给定日期均有效。我可以使用COUNT,但由于DPC_Type如何选择记录不是唯一的。
但是所有者= 200永远不会为真,因为他没有记录许可证。
我可以在应用程序中通过读取所有者的所有记录来做到这一点。如何在sql中一次完成此操作?
谢谢, Pubudu
答案 0 :(得分:1)
您可以使用聚合:
SELECT DOC_OwnerID
FROM mytable
WHERE @mydate >= DOC_start_date AND @mydate <= DOC_end_date
GROUP BY DOC_OwnerID
HAVING
MAX(DOC_type = 'JANUARY') = 1
AND MAX(DOC_type = 'DRIVER') = 1
AND MAX(DOC_type = 'LICENSE') = 1
对于给定的DOC_OwnerID
参数,这将返回@mydate
,具有所有三个DOC_type
值。
答案 1 :(得分:1)
您想返回表中的所有有效行,对吗?
因此,您必须在获得满足表条件的doc_owner_id
s后加入结果:
select t.*
from tablename t inner join (
select doc_owner_id
from tablename
where
str_to_date('4/9/2018', '%m/%d/%Y') between doc_start_date and doc_end_date
and
doc_type in ('JANUARY', 'DRIVER', 'LICENCE')
group by doc_owner_id
having count(distinct doc_type) = 3
) g on g.doc_owner_id = t.doc_owner_id
where
str_to_date('4/9/2018', '%m/%d/%Y') between t.doc_start_date and t.doc_end_date
and
t.doc_type in ('JANUARY', 'DRIVER', 'LICENCE')