Запрос выглядит следующим образом, есть 2 таблицы:
Pagos
-idPago
-idCliente
-fechaEnQuePaga
-fechaVencimiento
Cliente
-idCliente
-nombre
-apellidoPaterno
-apellidoMaterno
-correo
idCliente
является внешним ключом. Предположим, что в таблицах есть следующие данные:
Таблица выплат:
1 | 1 | 2018-02-23 | 2018-03-23
2 | 2 | 2018-02-23 | 2018-05-23
3 | 2 | 2018-02-23 | 2018-06-23
4 | 1 | 2018-04-23 | 2018-07-23
Таблица клиентов:
1 | Daniel | Sosa | Estrada | [email protected]
2 | Juan | Casas | Sola | [email protected]
И я хочу получить данные о клиентах, а затем данные об их платежах, но с самой отдаленной датой оплаты, ожидая получить:
1 | Daniel | Sosa | Estrada | 2018-04-23 | 2018-07-23
2 | Juan | Casas | Sola | 2018-02-23 | 2018-06-23
У меня есть запрос, который похож, но не дает ожидаемых результатов:
SELECT
cliente.idcliente,
nombre,
apellidoPaterno,
apellidoMaterno,
fechaEnQuePaga,
fechavencimiento
FROM cliente, pagos
WHERE (cliente.idcliente = pagos.idcliente)
GROUP BY idcliente;
Результат:
1 | Daniel | Sosa | Estrada | 2018-02-23 | 2018-03-25
2 | Juan | Casas | Sola | 2018-02-23 | 2018-05-23
Я заметил, что если я добавлю MAX()
его, он найдет самую дальнюю дату платежа, но не покажет соответствующую дату платежа:
SELECT
cliente.idcliente,
nombre,
apellidoPaterno,
apellidoMaterno,
fechaEnQuePaga,
MAX(fechavencimiento)
FROM cliente, pagos
WHERE (cliente.idcliente = pagos.idcliente)
GROUP BY idcliente;
Результат:
1 | Daniel | Sosa | Estrada | 2018-02-23 | 2018-07-25
2 | Juan | Casas | Sola | 2018-02-23 | 2018-06-23
Дата платежа не соответствует указанной в строке.
Спасибо за ваш ответ.
Оконные функции отлично подходят для такого типа запросов, но в MySQL их нет :(
Что вы можете сделать, так это обычное соединение (или левое соединение, если у клиента может не быть платежей), но добавить к нему соответствующий подзапрос, который фильтрует результаты по
MAX(fechavencimiento)
:Предупреждение: Если у клиента могут быть повторяющиеся значения
fechavencimiento
в таблицеpagos
, то есть вероятность, что этот запрос вернет более одной записи для каждого клиента.Вы можете сделать следующее:
Посмотрим:
P1
мы получаем максимумfechaVencimiento
на клиентаP2
мы получаем запись(и), чьи платежи соответствуют максимумуfechaVencimiento
. Важно , если у вас было несколько записей для клиента с одним и тем же (в вашем примере кажется, что этого не происходит), вы должны добавить еще одну вложенность, чтобы «решить», какую строку вы сохраняете, пока вы ожидаете, что будет иметь одна строка на клиента.P1
fechaVencimiento
JOIN
конец междуclientes
иpagos
, используйте,LEFT
если вы не хотите упускать из виду тех клиентов, у которых нет платежей, илиINNER
если вы хотите исключить их из запроса.Это довольно простое решение с использованием простого SQL, я думаю, что в MySql есть лучшие способы его решения.
Используйте INNER JOIN с ORDER BY
Таким образом, вы сможете получить объединение ваших строк и сможете фильтровать по нужному полю в указанном вами порядке (ASC (по возрастанию), DESC (по убыванию))
Запрос, который похож на него, заключается в том, что когда он группируется, он принимает последнее значение группы, поэтому вам нужно будет только добавить GROUP BY,
Если это не работает для вас, измените ASC на DESC и повторите попытку.
Вы должны быть осторожны с этим, если вы импортируете его в mysql с ограничением ONLY_FULL_GROUP_BY, он покажет ошибку
как они упоминают, это будет с внутренним соединением, подобным этому