Запрос SQL для выбора записей, которые проверяют хотя бы одну действительную запись с заданными критериями - PullRequest
0 голосов
/ 22 марта 2019

Я работал над формулировкой запроса для таблицы приемлемости с пользователем, который может иметь различные права.

Таблица будет иметь указанный ниже формат.

id | start_date | end_date | status | user_id
---------------------------------------------

Для этого мне нужнополучить всех пользователей с активным правом.Запрос на то же самое добавлен ниже.

select *
from users u
  inner join eligibility e on users.id=eligibility.user_id
where e.start_date <= '2019-03-22'
  and e.end_date >= '2019-03-22'
  and e.status<> 'inactive'

Это работает нормально, и я получаю eligibile пользователей, когда есть хотя бы одна действительная запись приемлемости с критериями, указанными в запросе.

Теперь Я должен проверить всех неподходящих пользователей , используя эти записи.

В основном нам придется выбирать пользователей без действительных записей о праве на участие.Если у пользователя есть хотя бы одна запись о праве на участие, он считается правомочным.

Ниже приведены примерные данные и ожидаемые результаты.

Таблица пользователей: -

id | first_name | last_name
---------------------------
1  |    John    |  Doe
2  |    Sam     |  Ronald
3  |   Alice    |  Wayne
4  |    Dean    |  Marcus
5  |    Bony    |  Ignatius
6  |    Kim     |  Pharm
7  |   Tony     |  Ryan

Правотаблица: -

id | start_date | end_date    | status | user_id
-------------------------------------------------
 1    2018-06-23  2018-12-31  | active |   1
 2    2018-06-23  2019-01-30  | active |   1
 3    2018-06-23  2018-12-31  | active |   3
 4    2018-06-23  2019-12-22  | active |   3
 5    2018-06-23  2018-12-31  |inactive|   4
 6    2018-06-23  2019-03-10  | active |   4
 7    2018-06-23  2018-12-31  | active |   5
 8    2018-06-23  2019-12-31  | active |   5
 9    2018-06-23  2018-01-31  | active |   6
 10   2018-06-23  2019-12-24  | active |   6
 11   2018-06-23  2018-12-31  |inactive|   7
 12   2018-06-23  2019-02-22  | active |   7
 13   2018-06-23  2019-12-31  | active |   1
 14   2018-06-23  2019-12-31  | active |   3

С этими данными и текущей датой имеют право пользователи с Id: 1,3,5 и 6.А пользователи с идентификатором 2 (не имеют записи о праве на участие), 4 и 7 не имеют права, если вы посмотрите на данные.

Примечание: статус «активный» не означает, что он активен.Мы также должны проверить диапазон дат.

Теперь я хочу знать, как я могу запрашивать неподходящих пользователей.

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Это условия для правомочного пользователя:

e.start_date <= '2019-03-22' and e.end_date >= '2019-03-22' and e.status<> 'inactive'

Так что, если в таблице eligibility нет строки для пользователя, удовлетворяющей этим условиям, то этот пользователь не подходит.
Вы можете использовать not exists:

select u.* from users u 
where not exists (
  select 1 from eligibility
  where 
    u.id = user_id 
    and
    start_date <= '2019-03-22' and end_date >= '2019-03-22'
    and 
    status <> 'inactive'
)
0 голосов
/ 22 марта 2019

Что это дает вам:

select * from users u
LEFT join eligibility e on users.id=eligibility.user_id
where e.user_id is NULL
0 голосов
/ 22 марта 2019

Вы пробовали раньше?

select * from users u
where exists(select 0 from eligible e
where u.user_id = e.user_id and 
'2019-03-22' between e.start_date and e.end_date and
e.status<> 'inactive')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...