#postgresql
Вопрос:
У меня есть относительно сложная проблема, которую я пытаюсь решить с помощью запроса, и мне интересно, можно ли это сделать с помощью одного запроса.
Для простого примера у меня есть таблицы для:
authors
(идентификатор, имя, фамилия, дата вступления в силу, дата выхода на пенсию)articles
(идентификатор, идентификатор автора, название, содержимое)recipients
(идентификатор, имя, адрес электронной почты)subscriptions
(идентификатор автора, адрес электронной почты)
Подписки, например, выглядят так:
// Subscriptions table
author_id email
1 'johnsmith@gmail.com'
1 'jackymoon@gmail.com'
2 'edmonix@gmail.com'
1 'louredwood@gmail.com'
2 'louredwood@gmail.com'
3 'louredwood@gmail.com'
4 'louredwood@gmail.com'
и т.д…
Я хочу вернуть список электронных писем, в котором электронное письмо возвращается только в том случае, если количество раз, когда оно встречается в таблице, равно второму запросу.
query_1 = SELECT email FROM recipients
WHERE email has an entry for every author returned from query_2...
query_2 = SELECT * FROM authors
WHERE current_date BETWEEN effective_date AND retirement_date
До сих пор мне приходилось выполнять только простые запросы, так что любая помощь будет очень признательна.
Ответ №1:
Простым решением было бы использовать подзапросы в предложении WHERE.
выбирать…. ГДЕ (ВЫБЕРИТЕ КОЛИЧЕСТВО(*) ИЗ подписок s, ГДЕ s.email = rp.email) = (ВЫБЕРИТЕ КОЛИЧЕСТВО(*) ИЗ авторов)
(найдите записи rp, где количество подписок равно количеству авторов) Или аналогичную комбинацию — например, найдите все записи rp, где количество не подписанных авторов равно 0