У меня есть этот массив php $:
usr_id | value 1 | value 2 | value 3
1 | a | b | c
2 | a | b | c
7 | d | e | f
8 | a | e | f
И я хочу разделить его на две реляционные таблицы с уникальными объединенными значениями:
ТАБЛИЦА 1> значения
id | value1 | value2 | value3
1 | a | b | c
2 | d | e | f
3 | a | e | f
ТАБЛИЦА 2> Отношения
id | usr_id | values_id
1 | 1 | 1
2 | 2 | 1
3 | 7 | 2
4 | 8 | 3
Какой самый простой способ сделать это?
Заранее большое спасибо!
Моя первая мысль — сделать два прохода над массивом php. Один раз создать таблицу значений, а затем снова создать таблицу отношений. Вероятно, есть способ сделать это всего за один проход, но, поскольку вы говорите, что вы будете делать это только 1 раз, возможно, нет необходимости оптимизировать его дальше.
(pcode)
create table values ( id int auto_increment, value1 int, value2 int value3 int,
primary key(id), unique key( value1, value2, value3 ));
foreach( $array as $val )
{
$q = $pdo->prepare( "insert ignore into values ( value1, value2, value3 ) values (?,?,?) " )
$q->bindParam( $val->value1 );
...
}
Затем сделайте второй проход, где вы выбираете подходящее значение из values
и вставьте в таблицу отношений.
(pcode)
foreach( $array as $val )
{
$ret = $pdo->do( "select id from values where value1 = ?, value2 = ?, value3 = ?" );
( build the query )
$row = $ret->fetch();
$id = $row->id;
(now insert into relations )
$pdo->prepare( "insert into relations (usr_id, values_id ) values ( ?, ? )" );
$pdo->bindParam( 1, $id );
$pdo->bindParam( 2, $val->usr_id );
$pdo->execute();
}
Других решений пока нет …