#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 );
Если приведенные выше предположения о структуре верны, вы можете отказаться от этого запроса, внеся изменения в Дочерний элемент.Статус зачисления напрямую и с помощью триггера для заполнения журнала регистрации