如何根据表与另一个表的关系更新表列?

时间:2012-04-12 05:01:19

标签: php mysql

我有一张名为“个人资料”的表格。这个表中有一个名为“user_id”的列,我将其名称更改为“username”,类型从INT(11)更改为Varchar(255)。但是,此列的内容仍为数字ID。

这些ID对应于另一个名为“users”的表。该表包含名为“user_id”和“username”的字段。对于“配置文件”表中的每一行,我需要首先检查用户名字段对于id的内容,然后在users表上查找以获取与该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 个答案:

答案 0 :(得分:0)

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

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

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

还有一个建议是没有必要使用

while($row = mysql_fetch_assoc($query))

因为只有一行

答案 1 :(得分:0)

正如Napster说你要覆盖 $ query $ row 变量。这应该可以解决你的问题。

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

希望有所帮助!

答案 2 :(得分:0)

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

个人资料表:

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

用户表:

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

答案 3 :(得分:0)

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

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

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