2012-04-12 56 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 

做到這一點,爲什麼你會想這樣做,這是另一個問題。

相關問題