0

经过一番折腾,我让这个查询工作了——但它看起来很笨重,运行时感觉很慢。

我有一个名为 UserTable 的表,如果特定用户对该项目说“是”,则会填充一个名为“项目”的字段。我只想在该实例中将该项目的一行添加到 UserTable 中 - 换句话说,我不想在表中有很多 user_ID/Item/'no' 关系,只有 user_ID/Item/'yes'回应。

我已经构建了一些代码,向用户显示整个数据集,并允许他们更改他们的偏好,然后按更新。当它们更新时,会输出一个名为 $checkbox 的数组,其中包括它们已勾选为“是”的项目编号(例如“1”、“3”、“6”)。如果他们没有勾选任何内容,则 $checkbox 设置为 ""。

这是相关代码 - 正如我所说,它非常笨拙,在 FOREACH 中有一个 WHILE 以及两个验证 IF 语句。我可以摆脱一个(或两个!)循环并用 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

因此,如果一个用户可以与多个项目相关联,那么您似乎应该对此进行规范化并可能拥有三个表 - 一个用于用户,一个用于项目,以及一个将用户与项目相关联的多对多表。

于 2012-11-27T23:47:47.053 回答
0

您可以消除两个 if 语句:

  1. 在 != "" 上过滤您的复选框数组并遍历这些结果。如果检查!=“”,那将摆脱第一个。

  2. 扩展您的初始查询以包含 row_exists = 0,并迭代这些结果。这摆脱了第二个如果。

事实上,您可以将两条 sql 语句合并为一个复合条件插入。您可以插入以下表格:

INSERT INTO table (SELECT ...)

因此,您可以查看第一个查询并将其调整/替换为上面查询的 SELECT... 部分,然后进行第二次插入并调整/替换它来代替上面的 INSERT INTO...。

于 2012-11-27T23:29:07.217 回答