Выберите клиентов без счетов после даты - PullRequest
2 голосов
/ 11 марта 2020

У меня есть Клиент и Счет таблицы. Они имеют отношение один-ко-многим , где Client.id = Invoice.client_id.

Клиентские столбцы :

  • id

Столбцы счета :

  • id,
  • client_id,
  • invoice_date

Конечно пример упрощен для соответствующих данных.

Я пытаюсь выбрать клиентов, у которых NOT были счета после '2010-01-01'.

Я не могу найти какой-либо рабочий способ сделать это. Некоторые маршруты, которые я выбрал, выглядят так (есть много других вариантов, но нет смысла отображать здесь):

SELECT c.id, COUNT(i.invoice_date > "2010-01-01") AS cnt 
 FROM Client AS c LEFT JOIN Invoice i ON i.client_id = c.id 
 GROUP BY c.id HAVING cnt = 0

и

SELECT client_id, COUNT(invoice_date > '2010-01-01') as cnt 
FROM Invoice
GROUP BY client_id HAVING cnt = 0

Ответы [ 3 ]

4 голосов
/ 11 марта 2020

Вы можете использовать подзапрос с NOT EXISTS следующим образом:

SELECT *
FROM Client
WHERE NOT EXISTS (
  SELECT 1
  FROM Invoice 
  WHERE Invoice.invoice_date > '2010-01-01' AND Invoice.client_id = Client.id
)

Вы также можете использовать SUM с CASE или IF:

-- CASE
SELECT c.id, SUM(CASE WHEN i.invoice_date > '2010-01-01' THEN 1 ELSE 0 END) AS cnt 
FROM Client AS c LEFT JOIN Invoice i ON i.client_id = c.id 
GROUP BY c.id
HAVING cnt = 0

-- IF
SELECT c.id, SUM(IF(i.invoice_date > '2010-01-01', 1, 0)) AS cnt 
FROM Client AS c LEFT JOIN Invoice i ON i.client_id = c.id 
GROUP BY c.id
HAVING cnt = 0

Вы также можете использовать COUNT, но с CASE или IF:

-- CASE
SELECT client_id, COUNT(CASE WHEN invoice_date > '2010-01-01' THEN 1 ELSE NULL END) as cnt 
FROM Invoice
GROUP BY client_id HAVING cnt = 0

-- IF
SELECT client_id, COUNT(IF(invoice_date > '2010-01-01', 1, NULL)) as cnt 
FROM Invoice
GROUP BY client_id HAVING cnt = 0

демо на dbfiddle.uk

3 голосов
/ 11 марта 2020

Вы также можете использовать NOT IN с подзапросом

SELECT * FROM client 
WHERE id NOT IN (
     SELECT client_id 
     FROM invoice
     WHERE invoice_date>'2020-01-01'
);
0 голосов
/ 11 марта 2020

Попробуйте: -


    Select Client.* from Client Client left join Invoice Invoice on 
    client.id = Invoice.client_id and Invoice.invoice_date > "2010-01-01" 
    where Invoice.client_id is null;

В основном вы включаете только подмножество данных после "2010-01-01" из таблицы счетов.

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