MySQL: вставка нескольких строк данных в таблицу, некоторые данные поступают из другой таблицы (реляционной)

Дополнительный вопрос к MySQL: вставка данных в таблицу, некоторые данные поступают из другой таблицы (реляционной)

Мой вопрос выше в основном спрашивал: «Как я могу вставить строку в таблицу, используя информацию, найденную в другой строке». Ответ состоял в том, чтобы использовать такой запрос, как:

INSERT INTO user_config(cid, sid, value)
SELECT $cid, id, $value
FROM user_settings
WHERE mid='$mid' AND name='$name'
ON DUPLICATE KEY UPDATE value = $value;

Моя проблема сейчас в том, что мне нужно вставить несколько строк. Для каждой строки, которую мне нужно вставить, есть разные значения для $cid, $value, $mid и $name. Например, я мог бы запустить следующее (псевдо):

function x($cid, $mid, $name, $value){
    // run query:
    INSERT INTO user_config(cid, sid, value)
    SELECT $cid, id, $value
    FROM user_settings
    WHERE mid='$mid' AND name='$name'
    ON DUPLICATE KEY UPDATE value = $value;
}

x(1,'a','b');
x(2,'c','d');
x(3,'f','e');

Проблема в том, что это будет запускать 3 запроса, и я хочу сделать это за один. Является ли это возможным? Я мог бы предоставить массив для $cid, $mid и $name, если это поможет решить проблему?


person Keir Simmons    schedule 18.07.2014    source источник
comment
1- почему вы хотите сделать это в 1 запросе вместо 3. 2- у вас есть $value в вашем запросе, но нет его в качестве параметра функции, откуда берется $value?   -  person Sean    schedule 18.07.2014
comment
Извините, $value - это параметр (только что отредактировал мой вопрос). Я буду вызывать эту функцию относительно регулярно и поэтому хочу уменьшить количество запросов, которые мне приходится выполнять при загрузке страницы.   -  person Keir Simmons    schedule 18.07.2014
comment
Почему бы вам не попробовать написать процедуру, которая перебирает ваш массив?   -  person Nail    schedule 18.07.2014
comment
Вы можете подсчитать, сколько раз вы будете запускать запрос, а затем, если будет более 2 запросов, просто сделайте 2 разных запроса, один из которых получит результаты, а другой вставит все: P   -  person Bobot    schedule 18.07.2014


Ответы (1)


Предположительно, информация в вызовах x выражается как выборка различных таблиц в вашей базе данных. Ваш список x вызовов выглядит как таблица со столбцами $cid, $mid, $name, $value, верно? (Ваши вызовы x должны иметь 4 аргумента, а не 3.)

Дайте определения таблиц и запрос, который выдает аргументы x в виде таблицы со столбцами cid, mid, name, value.

Затем измените выбор в своем вопросе, чтобы этот выбор x находился в FROM. Конечно, вам может не понадобиться выражать обновление с помощью подвыборки; Я просто описываю изменение с точки зрения добавления синтаксиса к приведенному вами синтаксису.

ОБНОВИТЬ

Вы можете создать (возможно, временную) таблицу по мере выбора x. Поместите эту таблицу в FROM. Если таблица существует, пока вы собираете несколько списков аргументов x, вы можете просто вставить каждый из них (cid, mid, name, value) по мере их получения.

INSERT INTO user_config (cid, sid, value)
SELECT cid, id, value
FROM user_settings s JOIN x
ON s.mid=x.mid AND s.name=x.name
ON DUPLICATE KEY UPDATE value = x.value;
person philipxy    schedule 18.07.2014
comment
Параметры, передаваемые функции x, берутся из параметров GET (после долгого возни с ними). Итак, в основном я вставляю строки в таблицу user_config, указывая значения для столбцов cid, sid и value. Значение для cid и value берется из массива ($cid[0] и $value[0] для первой вставки и т. д.), тогда как sid берется из строки в user_settings, соответствующей mid=$mid[0] и name=$name[0] и т. д. - person Keir Simmons; 18.07.2014
comment
Включает ли возня доступ к базе данных? Как вы пришли к тому, чтобы иметь несколько значений x? Вы их просто копите? (Я знаю, как вы используете x аргументов для одного вызова; я хотел знать, как вы получаете x аргументов для нескольких звонки.) Смотрите мой отредактированный ответ. - person philipxy; 18.07.2014
comment
@KeirSimmons Обновлен код для таблицы из x списков аргументов. - person philipxy; 19.07.2014