У меня есть таблица как таковая:
id entity_id first_year last_year sessions_attended age
1 2020 1996 2008 3 34.7
2 2024 1993 2005 2 45.1
3 ... ... ...
id - первичный ключ с автоматическим инкрементом, а entity_id - это внешний ключ, который должен быть уникальным для таблицы.
У меня есть запрос, который вычисляет первый и последний год посещаемости, и я хочу иметь возможность обновлять эту таблицу свежими данными каждый раз, когда она запускается, только обновляя столбцы первого и последнего года:
Это моя вставка/обновление для "первого года":
insert into my_table (entity_id, first_year)
( select contact_id, @sd:= year(start_date)
from
( select contact_id, event_id, start_date from participations
join events on participations.event_id = events.id where events.event_type_id = 7
group by contact_id order by event_id ASC) as starter)
ON DUPLICATE KEY UPDATE first_year_85 = @sd;
У меня есть одно подобное, что и "в прошлом году", идентичное, за исключением целевого столбца и порядка.
Только запросы возвращают требуемые значения, но у меня возникают проблемы с запросами на вставку/обновление. Когда я запускаю их, я получаю те же значения для обоих полей (правильное значение first_year).
Что-то выделяется как причина этого?
Anecdotal Примечание. Это похоже на работу с MySQL 5.5.54, но при запуске на моем локальном MariaDB оно просто демонстрирует вышеуказанное поведение...
Обновить:
Не мой дизайн стола, чтобы диктовать. Это CRM, который позволяет настраивать пользовательские поля конечными пользователями, я заполняю данные через внешние запросы.
В таблице участия хранятся все регистрации событий для всех объектов-сущностей, но даты начала хранятся в отдельной таблице событий, следовательно, соединение.
Переменная есть, потому что ON DUPLICATE UPDATE не примет ссылку на столбец без нее.
Возраст на самом деле немного больше задействован: это возраст по дате начала следующего активного события определенного типа.
Поля "жестко" обновляются, поскольку значения в этой таблице извлекаются из отчетов и поисков в CRM, они должны присутствовать, не могут быть динамически вычислены.
Поскольку у вас есть "естественный" PK (entity_id
), почему есть id
?
age
? Вам придется менять эту колонку ежедневно или, по крайней мере, ежемесячно? Не хороший дизайн. Было бы лучше иметь константу birth_date в таблице, а затем вычислить возраст в SELECT
.
"вычисляет первый и последний год посещаемости". Это означает, что у вас есть таблица, в которой перечислены все годы посещаемости (yoa
)? Если это так, MAX(yoa)
и MIN(yoa)
, вероятно, лучший способ вычислить вещи.
В запросах редко требуется @variables.
Мунк по моим комментариям; вернитесь для большего количества мыслей после того, как вы предоставите новый запрос, SHOW CREATE TABLE
, EXPLAIN
и некоторые примеры данных.
VALUES(col)
в частиUPDATE
IODKU.