0

我有一个名为“配置文件”的表。该表中有一个名为“user_id”的列,我已将其名称更改为“用户名”,并将类型从 INT(11) 更改为 Varchar(255) 。但是,此列的内容仍然是数字 ID。

这些 id 对应于另一个名为“users”的表。该表具有名为“user_id”和“username”的字段。对于“配置文件”表上的每一行,我需要首先检查用户名字段的 id 并在用户表上查找以获取与该 id 相对应的用户名,然后更新配置文件表的用户名值使用正确的用户名。

配置文件表:

username | blah blah...
------------------------
1        | ...

用户表:

user_id | username
------------------------
1       | Joe

我需要将配置文件表上的用户名字段的值更新为“Joe”。

我想出了这个 php 脚本,但由于某种原因只更新了 4 条记录后它就停止了工作:

    $sql = 'SELECT username FROM profiles';
    $query = mysql_query($sql);
    while($row = mysql_fetch_assoc($query)) {
        $id = $row['username'];
        $sql = 'SELECT username FROM users WHERE user_id = '. $id;
        $query = mysql_query($sql);
        while($row = mysql_fetch_assoc($query)) {
            $sql = "UPDATE profiles SET username = '".$row['username']."' WHERE username = $id";
            $query = mysql_query($sql);
            if(!$query) {
                echo 'error!';
            }
        }
    }

我的脚本一开始并不是那么高效,尽管这不是什么大问题,因为表只有 50k 条记录。无论如何,直接从 mysql 执行此操作的方法是什么?

4

4 回答 4

0

您正在第一个循环内操作 $row 变量。显然它不起作用。尝试给内部循环中的变量一个不同的名称。

不仅您使用的几乎所有变量,在第一个循环之外,您在内循环中使用相同的名称。

同样来到 db 模式,我更希望 ids 是外键而不是用户名,因为使用 ids 查询会比使用 varchar 类型的列更快。

还有一个建议是不需要使用

while($row = mysql_fetch_assoc($query))

因为只有一排

于 2012-04-12T05:04:26.017 回答
0

正如 Napster 所说,您正在覆盖您的$query$row变量。那应该可以解决您的直接问题。

此外,while 循环内的查询,while 循环内的查询是绝对可怕的。无意冒犯!我们都必须从某个地方开始。但我会强烈研究如何使用 JOIN 重写它,以便下次你的工具带中有一些东西。

希望有帮助!

于 2012-04-12T05:08:07.273 回答
0

我认为您的表之间的关系是错误的,您应该在profiles 表中有一个外键链接到users 表中的user_id,然后如果您将Joe 更改为Michael,它在profiles 表中的相应记录将被更新。

配置文件表:

user_id  | blah blah...
------------------------
1        | ...

用户表:

user_id | username
------------------------
1       | Joe
于 2012-04-12T05:11:30.480 回答
0

您可以在一个查询中执行此操作

UPDATE profiles t1 
    INNER JOIN users t2 ON t1.username=t2.user_id 
SET t1.username=t2.username

为什么要这样做是另一个问题。

于 2012-04-12T06:17:21.863 回答