#php #mysql #sql #implode
#php #mysql #sql #имплантировать
Вопрос:
У меня есть скрипт с запросом, который собирает информацию из базы данных из двух отдельных таблиц с помощью объединения. Теперь я хочу вставить эти 2 массива и их значения рядом внутри новой таблицы.
$query = "INSERT INTO `new_table`
(column_a, column_b)
VALUES
(implode(something,$array_a), implode(something,$array_b))"
Очевидно, синтаксис неправильный, но мне было интересно, возможно ли это или я на неверном пути. Я попробовал несколько запросов и не смог выстроить их в очередь для вставки — они разбивались по одному за раз.
Комментарии:
1. Не было бы лучше использовать SELECT INTO? Что-то вроде ВЫБОРА t1.field1, t2.field2 В new_table ИЗ <join-statement> . Однако, если вы не реструктурируете / архивируете, представление было бы еще лучше.
Ответ №1:
Ответ на этот вопрос, как и следовало ожидать, зависит от того, чего именно вы пытаетесь достичь.
Я предположу, что ваши два массива следующие (в целях демонстрации):
$arrayA = array(
'Alpha' ,
'Bravo' ,
'Charlie'
);
$arrayB = array(
'Zulu' ,
'Yankee' ,
'Xray'
);
Теперь, если вы хотите поместить эти значения в таблицу (называемую the_table для удобства использования), чтобы они создавали одну строку следующим образом
column_a | column_b
"Alpha,Bravo,Charlie" | "Zulu,Yankee,Xray"
Тогда SQL, который вы хотели бы создать, является
INSERT INTO `the_table` ( `column_a` , `column_b` )
VALUES ( "Alpha,Bravo,Charlie" , "Zulu,Yankee,Xray" )
И PHP для создания этого SQL может быть
$sqlTpl = 'INSERT INTO `the_table` ( `column_a` , `column_b` )
VALUES ( "%s" , "%s" )';
$sqlStr = sprintf( $sqlTpl ,
implode( ',' , $arrayA ) ,
implode( ',' , $arrayB ) );
Теперь, если бы вы вместо этого хотели создать набор совпадающих строк с одной парой из каждого из двух массивов, вот так
column_a | column_b
"Alpha" | "Zulu"
"Bravo" | "Yankee"
"Charlie" | "Xray"
SQL был бы
INSERT INTO `the_table` ( `column_a` , `column_b` )
VALUES ( "Alpha" , "Zulu" ) ,
( "Bravo" , "Yankee" ) ,
( "Charlie" , "Xray" )
И PHP для создания этого может быть
$sqlTpl = 'INSERT INTO `the_table` ( `column_a` , `column_b` )
VALUES ( %s )';
$sqlArr = array();
foreach( $arrayA as $k => $v )
$sqlArr[] = '"'.$arrayA[$k].'" , "'.$arrayB[$k].'"';
$sqlStr = sprintf( $sqlTpl ,
implode( ' ) , ( ' , $sqlArr ) );
Ответ №2:
Использовать:
$query = sprintf("INSERT INTO `new_table`
(column_a, column_b)
VALUES
('%s', '%s')",
implode(something, $array_a),
implode(something, $array_b));
Тем не менее, обычно хранить денормализованные данные — не лучшая идея.
Комментарии:
1. Я согласен с OMG Ponies, в лицо я бы сказал, что эти элементы принадлежат к собственной таблице, поэтому они связаны