РЕЗЮМЕ
Мы генерируем набор данных, содержащий только ICID и max (date_sub) (псевдоним: ICDi) Мы присоединяем его к InternetClientDetails (ICD), чтобы получить только максимальную запись датыза клиента.Затем оставьте присоединиться к записи IC;обеспечение сохранения всех записей InternetClient (IC);и показывать только связанную максимальную подробную запись.
Приведенный ниже подход должен работать в большинстве версий mySQL.Он не использует аналитику, которую мы могли бы использовать, чтобы получить максимальную дату вместо производной таблицы, при условии, что поддерживаемая вами версия MySQL *
ФИНАЛЬНЫЙ ОТВЕТ:
SELECT IC.id
, IC.full_name
, IC.location
, IC.phone_number
, ICD.icid
, ICD.incdid
, ICD.date_sub
, ICD.date_exp
, ICD.isPaid
, ICD.sub_price
FROM internetClient IC
LEFT JOIN (SELECT ICDi.*
FROM internetclientdetails ICDi
INNER JOIN (SELECT max(date_sub) MaxDateSub, ICID
FROM internetclientdetails
GROUP BY ICID) mICD
ON ICDi.ICID = mICD.ICID
AND ICDi.Date_Sub = mICD.MaxDateSub
) ICD
on IC.id=ICD.icid
ORDER BY ICD.incdid desc
BREAKDOWN / ОБЪЯСНЕНИЕ
Ниже приведено подмножество max (date_Sub) для каждого ICID в clientDetails.Нам нужно, чтобы мы могли отфильтровать все записи, которые не являются максимальной датой для clientID.
(SELECT max(date_sub) MaxDateSub, ICID
FROM internetclientdetails
GROUP BY ICID) mICD
Используя этот набор, мы объединяем детали Client_ID и максимальную дату, чтобы исключить все, кроме самой.последние детали для каждого клиента.Мы делаем это, потому что нам нужны другие подробные атрибуты.Это может быть сделано с помощью объединения или существует.Я предпочитаю подход к объединению, так как он кажется мне более явным.
(SELECT ICDi.*
FROM internetclientdetails ICDi
INNER JOIN (SELECT max(date_sub) MaxDateSub, ICID
FROM internetclientdetails
GROUP BY ICID) mICD
ON ICDi.ICID = mICD.ICID
AND ICDi.Date_Sub = mICD.MaxDateSub
) ICD
Наконец, полный запрос соединяет клиента с клиентом, сохраняющим детализацию, даже если нет детализации с использованием левого соединения.
КОМПОНЕНТЫ:
- Вы хотели все записи из InternetClient (
FROM internetClient IC
) - Вы хотели связанные записи из InternetClientDetail (
LEFT Join InternetClientDetail ICD
) при сохранении записейот InternetClient. - Вы ТОЛЬКО хотели получить самую последнюю запись из InternetClientDetail (
INNER JOIN InternetClientDetail mICD
в качестве производной таблицы, получающей ICID и max (date)) - Общее количество записей должно = общее количество записей в InternetClientэто означает, что все связи должны быть 1: 1 на соединениях таблицы - один к одному Необязательно.