Обновление MySQL внутреннее соединение с МАКСИМАЛЬНОЙ датой

#mysql #sql

#mysql #sql

Вопрос:

В MYSQL 8.0 у меня есть две таблицы со следующей структурой:

 Table1 :Child ChildId | EnrolmentId | EnrolmentStatus  Table 2 : Enrolment EnrolmentId | EnrolmentStatus | DateUpdated   

Я пытаюсь обновить значение EnromentStatus в дочерней таблице, присоединившись к таблице регистрации, используя TSQL ниже:

 UPDATE child INNER JOIN enrolment ON child.enrolmentid= enrolment.enrolmentid SET child.EnrolmentStatus = enrolment.enrolmentstatus  WHERE child.enrolmentid = enrolment.enrolmentid;  

Проблема в том, что при зачислении есть несколько записей для зачисления ребенка, поэтому мне нужно сделать МАКСИМУМ(дата обновлена), чтобы получить только одну запись для обновления статуса до последнего статуса, но я не могу собраться с мыслями, чтобы получить только одну запись.

Комментарии:

1. Необходимо ли использовать только внутреннее соединение? Разве вы не можете использовать вложенные запросы?

2. Я не совсем помню, что именно, но я думаю, что вы могли бы использовать ОБЪЕДИНЕНИЕ в обновлении на основе выбора типа «выберите топ 1…. заказ по дате обновления», который выбрал бы самую последнюю дату. Приношу извинения за неопределенность, в данный момент на работе много чего происходит. Надеюсь, это поможет.

3. @groovy_guy никакое внутреннее соединение не требуется, пока я могу получить последнюю запись с помощью вложенного запроса. Я пробовал это, но он не нравится: обновление ребенок как C соединение (выбрать максимум(lastUpdatedDateTime), уху.enrolmentid, уху.arrangementStartDate,уху.arrangementEndDate,уху. status От ccsenrolment СЦК где c.EnrolmentId = СЦК.enrolmentID ) набор с.enrolmentstatus = а.статус, гр.enrolmentsStartDate = а.arrangementstartdate, гр.enrolmentEndDate = а.arrangementenddate;

4. Пожалуйста, включите примеры данных для каждой таблицы. Ваше описание предполагает, по крайней мере для меня, что ваша структура таблицы может нуждаться в настройке. Если у вас несколько строк регистрации для каждой дочерней строки, мне кажется, что идентификатор участника в таблице регистрации должен быть первичным ключом, а в дочерней таблице должен быть внешний ключ. Примеры данных помогли бы прояснить это. Извините, если я лаю не на то дерево.

Ответ №1:

Попробуйте что-то подобное,
это просто простой вложенный запрос, который обновляет все статусы ребенка за один раз без использования INNER JOIN .

 UPDATE child  SET child.enrolmentstatus= (  SELECT enrolment.enrolmentstatus  FROM enrolmentstatus  WHERE child.enrolmentid = enrolment.enrolmentid  ORDER BY DateUpdated DESC  LIMIT 1  )  

Комментарии:

1. Отлично сработало, мне просто нужно было добавить ОГРАНИЧЕНИЕ 1, иначе он жаловался на несколько строк в подзапросе.

2. @snowflakes74 да, позвольте мне обновить ограничение в запросе для других, если кто-то сочтет это полезным

Ответ №2:

Если ваша таблица регистрации отслеживает статус зачисления с течением времени, то может показаться, что текущая взаимосвязь между двумя таблицами является неправильной.

 CREATE TABLE Child (  ChildId TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,  EnrolmentStatus VARCHAR(20) NOT NULL );  CREATE TABLE EnrolmentStatusLog (  EnrolmentStatusLogId TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,  ChildId TINYINT UNSIGNED NOT NULL,  EnrolmentStatus VARCHAR(20) NOT NULL,  DateUpdated DATETIME NOT NULL );  

тогда запрос, предложенный @groovy_guy, просто нуждается в изменении соединения

 UPDATE Child  SET Child.EnrolmentStatus= (  SELECT EnrolmentStatusLog.EnrolmentStatus  FROM EnrolmentStatusLog  WHERE Child.ChildId = EnrolmentStatusLog.ChildId  ORDER BY DateUpdated DESC  LIMIT 1  );  

Если приведенные выше предположения о структуре верны, вы можете отказаться от этого запроса, внеся изменения в Дочерний элемент.Статус зачисления напрямую и с помощью триггера для заполнения журнала регистрации