2011-10-24 9 views
0

従業員から入力されたデータを保持する1つのテーブルを更新しようとしています。このテーブルには、エントリID、フィールドID、および値の3つの列があります。私は各エントリに応じて、このテーブルのすべてのフィールドの行があることを確認したいと思います。私は次のようなphp/sqlスクリプトを書いています。思考プロセスは2つの配列(エントリIDとフィールドIDを含む配列)を取得し、入力テーブルを調べてすべてのフィールドとエントリの既存の行があるかどうかを確認しました。そうでない場合は、コマンドにinertを使用して値0の行を追加しますが、このコマンドは失敗しています。私の推測は、この機能の強度によるタイムアウトエラーです。助言がありますか?2つの他のテーブルのデータで1つのmySQLテーブルを更新しようとしていません

 
$db = JFactory::getDBO(); 

$field_query = 'SELECT id FROM `jos_directory_field`'; 
$db->setQuery($field_query); 
$fields = $db->loadObjectList(); 

$entry_query = 'SELECT id FROM `jos_directory_entry`'; 
$db->setQuery($entry_query); 
$entries = $db->loadObjectList(); 

    for($e=0;$e count($entries);$e++) { 
    for($i=0;$i count($fields);$i++) { 
     $insert_query = 'INSERT INTO `jos_directory_enf` (entry_id,field_id,field_value)'; 
     $insert_query .= 'SELECT '.$entries[$e]->id.','.$fields[$i]->id.',0'; 
     $insert_query .= 'FROM dual WHERE NOT EXISTS (SELECT * FROM `jos_directory_enf`'; 
     $insert_query .= 'WHERE entry_id = '.$entries[$e]->id.' and field_id = '.$fields[$i]->id.')'; 
     $db->setQuery($insert_query); 
     $db->query(); 
    } 
    } 
+1

すぐに爆発するか、ハングアップしているように見えますか? –

+0

テーブルのサイズはどれくらいですか?テーブルサイズ(mmm、おそらく多少)のために、PHP自体からメモリが足りなくなる可能性があります。また、あなたは 'COMMIT'レベルで実行していますか? –

+0

DUALという実際のテーブルがありますか?またはこれはORACLE構文のキャリーオーバーですか? – Sparky

答えて

0

Joomlaは準備された文をサポートしていないようです。繰り返しクエリの実行に役立つため、Joomlaはそれをサポートしていません。

ただし、この場合はより良い選択肢があります。 INSERT文にはIGNORE節を使用して、PHPコードを単一のSQL文で置き換えることができます。まず、entry_idfield_idの列にunique indexがあることを確認してください。jos_directory_enfです。その場合、SQL文は次のようになります。

INSERT IGNORE INTO `jos_directory_enf` (entry_id,field_id,field_value) 
    SELECT e.id, f.id, 0 
    FROM jos_directory_entries AS e 
    JOIN jos_directory_field AS f 
; 

です。

+0

私はINSERT IGNOREが行を複製すると仮定しましたが、私はあなたの提案と共にとにかく実行することに決めました。実際には既存の行をすべて複製し、必要な行を追加します。 – user830381

+0

あなたがユニークなインデックスを作成しなかったように聞こえます。そうすると、重複する行が重複キー・エラーを引き起こし、行が追加されなくなります。 'IGNORE'はエラーが原因でクエリが停止するのを防ぎます。 – outis

関連する問題