dklight
@dklight
php кодер - level 2.5

Как выполнить обновление поля последней датой по связанным таблицам?

Есть таблица emps, для каждой из них берутся id, по нему получается ch_id, neg_id и ищется самая свежая дата.
Исходя из них из 8 связанных таблиц берется самая свежая дата и присваивается полю last_event_date этой же записи.

Решение для фиксированной записи
set @emp_id = 287918153;
SELECT
    @emp_ch_id := ch_id,
    @emp_neg_id := neg_id
FROM
    emps WHERE id = @emp_id;

SELECT @emp_latest_date := MAX(latest.created_at) as max_last_event_date
FROM (
              SELECT created_at FROM emp_cms WHERE employee_id = @emp_id
    UNION ALL SELECT created_at FROM emp_ems WHERE employee_id = @emp_id
    UNION ALL SELECT created_at FROM emp_fls WHERE employee_id = @emp_id
    UNION ALL SELECT created_at FROM hiss WHERE subject_id = @emp_id AND s_type = "ApMoEmp" AND field = "emp_f_id"
    UNION ALL SELECT created_at FROM hms WHERE ch_id = @emp_neg_id
    UNION ALL SELECT created_at FROM rms WHERE ch_id = @emp_neg_id
    UNION ALL SELECT created_at FROM zms WHERE ch_id = @emp_neg_id
    UNION ALL SELECT created_at FROM ams WHERE ch_id = @emp_ch_id
    )
AS latest;

update emps
set emps.last_event_date = @emp_latest_date
where emps.id = @emp_id;


А как сделать расширить решение, чтобы для всех записей таблица работало?
  • Вопрос задан
  • 57 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
Шаблон:

UPDATE main_table
JOIN ( SELECT id, MAX(created_at) AS created_at
       FROM ( SELECT id, created_at from slave1
              UNION ALL
              SELECT id, created_at from slave2
              UNION ALL
              ...
              UNION ALL
              SELECT id, created_at from slaveN             
              ) AS alldates
       GROUP BY id
       ) AS maxdate USING (id)
SET main_table.created_at = maxdate.created_at
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы