0

私がこのようなテーブルを持っている場合:

+-------------+-------------+
| Field       | Type        |
+-------------+-------------+
| document    | varchar(35) |
| section     | int(11)     |
| selection   | int(11)     |
| status      | varchar(35) |
+-------------+-------------+

そして、私はPHPの配列を持っています。それを呼びましょう$choices[]。この列selectionは、choices配列の配列インデックスに対応しています。1つまたは複数の要素を$choices配列に追加する場合は、データベースを更新する必要があります。$documentとが設定されているループで動作します$section。番号付けの途中に行が欠落していないとは思いません。$choicesの各要素の(ドキュメント、セクション、選択)をチェックし、存在しない要素を作成し、そのステータスを「新規」に設定する最も効率的な方法は何ですか?これをループとして実行する必要がありますか、それとも1つのクエリでこれを実行する方法がありますか?

これは完全にテストされていませんが、基本的には、助けを求めなかった場合の方法です。私は誰かが私よりもはるかに優れた解決策を持っているかもしれないと推測しました。

foreach($documents as $document)
  {
    foreach($sections as $section)
      {
        $choices=$master_array[$document][$section];
        $ch_count=count($choices);
        $counter=0;
        while($counter < $ch_count-1)
          {
            $query="SELECT status FROM mytable WHERE document='$document' AND section='$section' AND selection='$counter'";
            $result = mysql_query($query);
            if(mysql_num_rows($result)==0)
              {
                $query="INSERT INTO mytable VALUES('$document','$section','$counter','new')";
                $result = mysql_query($query);
              }
            $counter++;
          }
      }
   } 
4

2 に答える 2

0

ループを使用して、次のような大きなクエリ文字列を連結することになりました。

INSERT IGNORE INTO mytable VALUES 
('doc1','1','0','New'),
('doc1','1','1','New'),
('doc1','1','2','New'),
('doc1','1','3','New'),
('doc1','2','0','New'),
('doc1','2','1','New'),
('doc1','2','2','New'),
('doc1','2','3','New'),
('doc1','3','0','New'),
('doc1','3','1','New'),
('doc1','3','2','New')

そして、それは機能します。それが最高かどうかはわかりませんが、少なくとも何百ものクエリをDBに送信していません。

于 2012-08-02T20:44:45.193 に答える
0

すべてが「新規」で更新される場合、これはやや簡単に達成できます。

次のコードを調べます。

<?
$setStr = "";
foreach($choices as $column)
{
    $setStr .= $column . "=" . "'new', ";
}

$sqlCommand = "UPDATE table SET ".substr($setStr,'',-2)." WHERE pick_a_row_here;";
echo $sqlCommand;
?>

存在しないものについては、値が指定されていない場合にデフォルトで false になるように構成してみてください。もちろん、INSERT ステートメントは、上記の UPDATE ステートメントから簡単に適用できます。

どう考えているか教えてください。質問やコメントがあれば、できる限りお答えします。

于 2012-08-02T14:14:33.563 に答える