MySQL: где максимальная дата в объединенной таблице меньше - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть 3 таблицы - client, invoice и invoice_item.Мне нужно выбрать всех клиентов, у которых последняя дата покупки меньше указанной даты.Дата покупки сохраняется в таблице invoice_item, позиции, присвоенные накладной, и накладная, присвоенная клиенту.Вот что я пытался

SELECT c.* FROM client c
INNER JOIN (
            SELECT i.client_id as clid, MAX(item.date_created) as mdt
            FROM invoice i
            INNER JOIN invoice_item item on i.id = item.invoice_id
            GROUP BY i.id
            ) joined
ON joined.clid = c.id
WHERE joined.mdt  < date('2017-01-01')

А также

SELECT c.* FROM client c
WHERE c.id IN (
            SELECT DISTINCT i.client_id FROM invoice i
            INNER JOIN invoice_item item on i.id = item.invoice_id
            GROUP BY i.id
            HAVING MAX(item.date_created) < date('2017-01-01')
            )

Оба запроса возвращают неверный результат, вот запрос, который я использую для проверки правильности:

SELECT MAX(invoice_item.date_created) FROM invoice_item
INNER JOIN invoice i on invoice_item.invoice_id = i.id 
WHERE client_id = {some id from the previous query};

Приведенный выше запрос возвращает дату, для некоторых клиентов превышающую 2017-01-01.

Что я делаю не так?Спасибо.

1 Ответ

0 голосов
/ 27 ноября 2018

Вы группируете данные по идентификатору счета в подзапросе, но вы должны группировать данные по client_id в своем подзапросе.

SELECT c.* FROM client c
INNER JOIN (
            SELECT i.client_id as clid, MAX(item.date_created) as mdt
            FROM invoice i
            INNER JOIN invoice_item item on i.id = item.invoice_id
            GROUP BY i.client_id
            ) joined
ON joined.clid = c.id
WHERE joined.mdt  < date('2017-01-01')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...