Как прочитать несколько строк и дат в таблице MySQL в одном операторе чтения? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть таблица 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  

В моей логике приложения мне нужно найти, что любой владелец (DOC_OwnerID) имеет три основных обязательных документа (JANUARY, DRIVER, LICENSE) за данный период времени. Количество 3 необходимо, чтобы показать, что владелец имеет три документа. (Имена документов уникальны для определенного периода времени)

Например: OwnerID = 100, Дата = 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

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Вы хотите вернуть все допустимые строки из таблицы, верно?
Таким образом, вы должны объединить результаты после получения 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')
1 голос
/ 06 апреля 2019

Вы можете использовать агрегацию:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...