Объяснение запроса вставки с помощью запросов выбора внутри

#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. Большое спасибо. Ты потрясающий.