0

何度も頭を悩ませた後、このクエリが機能するようになりましたが、見た目が悪く、実行すると遅く感じます。

特定のユーザーがそのアイテムに「はい」と言った場合に入力される「アイテム」というフィールドを持つ UserTable というテーブルがあります。そのインスタンスの UserTable にそのアイテムの行を追加したいだけです。つまり、テーブルに多くの user_ID/Item/'no' 関係を持たせたくありません。user_ID/Item/'yes' だけです。反応。

ユーザーにデータセット全体を表示し、設定を変更してから更新を押すことができるコードを作成しました。それらが更新されると、$checkbox と呼ばれる配列が出力されます。これには、「はい」にチェックを入れた項目番号 (例: "1"、"3"、"6") が含まれます。何もチェックしない場合、$checkbox は "" に設定されます。

関連するコードは次のとおりです。私が言うように、非常に扱いにくく、FOREACH 内に WHILE があり、2 つの検証 IF ステートメントがあります。ループの 1 つ (または両方!) を取り除き、SELECT タイプのコマンドに置き換えることはできますか?

foreach($checkbox as $value)
    {if($value!="") {
        $sql=   "SELECT count(Item) as row_exists 
                FROM UserTable
                WHERE Item = '$value' and 
                User_ID = '$current_user_id'";

        $result = mysqli_query($mysqli,$sql) or die(mysqli_error($mysqli));

        while ($iteminfo = mysqli_fetch_array($result)) {
            If ((int)$iteminfo['row_exists']==0) { 
                    $sql = "INSERT INTO UserTable 
                            (User_ID,Item,Date) VALUES
                            ('$current_user_id','$value',now() )";
            $add_new_row = mysqli_query($mysqli,$sql) or die(mysqli_error($mysqli));
            } 
        }
    }
}

よろしくお願いします。

4

2 に答える 2

0

したがって、1 人のユーザーを複数のアイテムに関連付けることができる場合は、これを正規化し、おそらく 3 つのテーブル (ユーザー用、アイテム用、およびユーザーとアイテムを関連付ける多対多テーブル) を作成する必要があるようです。

于 2012-11-27T23:47:47.053 に答える
0

両方の if ステートメントを削除できます。

  1. チェックボックス配列を != "" でフィルタリングし、それらの結果をループします。!= "" をチェックする場合、最初のものを取り除きます。

  2. row_exists = 0 を含めるように最初のクエリを拡張し、それらの結果を反復処理します。これにより、2 番目の if が取り除かれます。

実際、おそらく 2 つの SQL ステートメントを 1 つの複合条件付き挿入にマージできます。次の形式の挿入を行うことができます。

INSERT INTO table (SELECT ...)

したがって、最初のクエリを取得して、上記のクエリの SELECT... 部分に適応/置換し、2 番目の挿入を取得して、上記の INSERT INTO... の代わりにそれを適応/置換することを検討できます。

于 2012-11-27T23:29:07.217 に答える