2012-04-12 27 views
0

我有一个名为“配置文件”的表。这个表中有一个名为“user_id”的列,我将其名称更改为“用户名”,并将类型从INT(11)更改为Varchar(255)。但是这个列的内容仍然是数字ID。如何根据它与另一个表的关系来更新表列?

这些ID对应于另一个称为“用户”的表。该表具有名为“user_id”和“用户名”的字段。对于“个人资料”表上的每一行,我需要首先检查用户名字段对id的查询,然后查看用户表以获取与该id对应的用户名,然后更新配置文件表的用户名值用正确的用户名。

概况表:

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

用户表:

user_id | username 
------------------------ 
1  | 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!'; 
      } 
     } 
    } 

我的剧本是不是所有的效率,首先,虽然这不是什么大问题因为表格只有5万条记录。无论如何,将直接从MySQL做到这一点的方法是什么?

+0

我的问题是你为什么要这样做?你正在从一个结构良好的规范化模式转移到可能更难以处理并导致问题的事情上。 – liquorvicar 2012-04-12 06:12:27

+0

@livvvicar是的,我决定不。我的首要原因是根据用户名选择用户,让url看起来像mysite.com/profile?user=Bob,而不是用id而不是Bob。但我没有考虑这样一个事实,即通过数字标识和varchar内容进行选择会更快,id永远不变,等等。现在,我将如此类似:mysite.com/profile?user=Bob&id=123,这样姓名和身份证都在那里,但我只是通过id选择名称并在那里出于美学/可用性的原因。 – TK123 2012-04-12 21:06:02

回答

0

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

不仅如此,几乎所有你正在使用第一循环外,您使用的是内环内的相同名称的变量。

也即将到DB模式我宁愿IDS是外键没有用户名,因为使用IDS查询会比VARCHAR类型的列更快。

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

while($row = mysql_fetch_assoc($query)) 

,因为将只有一个行

0

正如Napster公司说你覆盖你$查询,并$行变量。这应该解决你的直接问题。

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

希望有帮助!

0

我觉得你的表之间的关系是不对的,你应该有谱表的外键链接的用户表中user_id说明,这时如果你想改变什么像乔迈克尔,在曲线表其相应的记录将被更新。

概况表:

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

用户表:

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

您可以在一个查询

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

做到这一点,为什么你会想这样做,这是另一个问题。

相关问题