Возможно ли вообще?... Есть таблица образцов (obrazec) 1. id 2. группа (GR) 3. номер 4. статус вывел запросом select * from obrazec WHERE GR='44' запрос показал все строки, с группой 44. Например 4 строки. есть таблица операций 1.id 2.id_obrazec 3.название операции 4.дата Есть форма для добавления данных выбираем из select образец, записываем название и дату. добавить одновременно столько строк операций, сколько показало строк в первом запросе и присвоить им id образца. все данные одинаковые, кроме id образца. массив нужно сделать insert into?
Надо сделать несколько - по числу добавляемых операций - запросов INSERT INTO. Вы можете либо засунуть их в массив и выполнять эти запросы по очереди, либо объединить их одной длинной строкой с разделителем - точка с запятой - между запросами, и скормить Вашему серверу БД эту длинную строку один раз. Такой синтаксис (несколько запросов через точку-с-запятой) понимает абсолютное большинство СУБД, но я, конечно, не могу ручаться за абсолютно каждый из существующих. Конкретно mySQL я не проверял.
А можно, кстати, и одним запросом: INSERT INTO operations SELECT is_obrazec, 'имя операции', '2019/07/18' FROM obrazec WHERE gr=44 (В синтаксисе мог напутать)
Надо бить (сильно) в лоб за такие советы. Необходимо сформировать многострочный INSERT (это абсолютно не одно и то же, что "несколько запросов через точку-с-запятой") Быстро однако одумался
Пожалуйста, не надо отвечать на мои сообщения в таком тоне. Мы с Вами незнакомы. В зависимости от условий задачи и 1-ый. и 2-ой, и 3-ий варианты имеют право на жизнь. И я готов предложить пример ситуации, когда 1-ый вариант будет намного лучше 3-го со всех точек зрения, в т.ч. и с т.з.нагрузки на сервер.
Внимательно слушаю P.S. Мой тон всегда прямо пропорционален качеству совета вне зависимости от статуса знакомства. Никакого негатива лично к Вам я не испытываю.
??? Ну элементарно же ж. В случае, если таблица OBRAZEC не проиндексирована по полю GR и имеет очень много строк. Тогда при выполнении 1-го запроса SELECT FROM obrazec WHERE GR=44 сервер выполняет full table scan - мы идем на это, т.к. нам надо на клиенте заполнить HTML SELECT с названиями образцов. Если после этого мы запустим запрос "INSERT INTO... SELECT FROM", мы нарвемся на ВТОРОЙ full table scan при том, что небходимая информация (ID'ы образцов) у нас уже есть и тащить их из БД такими трудозатратами нам не нужно. В этом случае 1-ый вариант будет предпочтительнее 3-го. Причем я даже могу придумать ситуацию, когда вышеописанное, т.е. отсутствие индекса по полю GR - это продуманный результат грамотного построения БД, а вовсе не отходы жизнедеятельности второкурсника
@sushko, вряд ли Вы меня напугаете таблицей без индекса. А вот на счёт всего остального высосано из пальца. Сделали выборку, сформировали html форму, отправили данные обратно на сервер, сформировали многострочный INSERT, добавили данные в БД. Один запрос на 10, 100, 1000 строк предпочтительнее, чем 10, 100, 1000 запросов. Это в самом простом случае. Более сложные варианты без конкретного ТЗ обсуждать не имеет смысла.
Отписываю как получилось, если есть к чему придраться, я буду только рад! 1. запрос на вывод только тех образцов, которые в группе "44" $str="select * from obrazec WHERE GR='44' "; 2. выводим данные по образцам: $sql=mysql_query($str); while($dp=mysql_fetch_object($sql)){ $ID_OBRZ=$dp->ID_OBRZ; $GR=$dp->GR; $NUMOBRZ=$dp->NUMOBRZ; $f=$ID_OBRZ; //пусть id будет в переменной f. 3. запрос insert into $u=isset($_POST['submit']); if($u=="Сохранить") { $GR=STRIP_TAGS($_POST['GR']); $ID_OBRZ=STRIP_TAGS($_POST['ID_OBRZ']); $NAMEOPER=STRIP_TAGS($_POST['NAMEOPER]); $DATEOP=STRIP_TAGS($_POST['DATEOP]); $query=mysql_query("INSERT INTO operacdiag (ID_OBRZ, NAMEOPER, DATEOP) VALUES ('$f, '$NAMEOPER','$DATEOP' )"); } } Попробовал и если в группе штук 40 образцов, очень быстро обрабатывает. Если что-то плохо, буду рад если напишите.
Будет лучше, если Вы, действительно, сделаете все одним запросом, т.е. замените ВЕСЬ приведенный Вами кусок кода на: $query = sprintf ( 'INSERT INTO operacdiag (ID_OBRZ, NAMEOPER, DATEOP) SELECT idobrz, "%s", "%s" FROM obrazec WHERE gr=44' , STRIP_TAGS($_POST['NAMEOPER]), STRIP_TAGS($_POST['DATEOP]) ); и дальше выполнять этот запрос. Оно и в исходном коде аккуратнее лежать будет (меньше кода - легче его прочесть в будущем), и сервер меньше напряжет.