#mysql
#mysql
Вопрос:
Я рефакторингую чей-то код, где подобные запросы встречаются повсюду, и я не могу понять, что происходит. Я понятия не имею, что искать, и «вставка mysql с вложенным выбором» не дает ничего полезного.
INSERT INTO stats_users_hour (
hour,
uid,
lastupdate,
hash1hr
)
SELECT * FROM (SELECT
? as hour,
? as uid,
? as lastupdate,
? as hash1hr) AS tmp
WHERE NOT EXISTS (
SELECT lastupdate FROM stats_users_hour WHERE lastupdate = ? AND uid = ?
) LIMIT 1
ON DUPLICATE KEY UPDATE lastupdate = ?, hash1hr = ?
Я даже не уверен, как правильно сделать отступ. Я предполагаю, что первый выбор использует значения, полученные из второго выбора, но откуда второй выбор получает свои данные? Это просто запрос «обновить или создать»? И используются ли результаты первого выбора в качестве значений для запроса вставки?
Извините, если это дубликат. Любая помощь приветствуется.
редактировать: также предложение where, к какому запросу оно применяется? Я предполагаю, что первый запрос выбора, но не совсем уверен.
Ответ №1:
Это создаст таблицу с одной строкой, которая будет вставлена, если появятся условия soem, см. Ниже
SELECT
? as hour,
? as uid,
? as lastupdate,
? as hash1hr
это проверит, существует ли такая строка уже в таблице stats_users_hour
(то же pid
самое и lastupdate
)
WHERE NOT EXISTS (
SELECT lastupdate FROM stats_users_hour WHERE lastupdate = ? AND uid = ?
)
И когда такая строка существует,, так что теперь будет вставлена новая строка
ON DUPLICATE KEY UPDATE lastupdate = ?, hash1hr = ?
Это обновит строку новейшими данными для lastupdate
и hash1hr
Комментарии:
1. Большое спасибо. Ты потрясающий.