2012-04-12 7 views
0

私は "プロファイル"と呼ばれるテーブルを持っています。このテーブルには "user_id"というカラムがあり、名前を "username"に変更し、タイプをINT(11)からVarchar(255)に変更しました。ただし、この列の内容は数値IDです。テーブルの列を別のテーブルとの関係に基づいて更新するにはどうすればよいですか?

これらのIDは、「ユーザー」と呼ばれる別のテーブルに対応しています。そのテーブルには "user_id"と "username"というフィールドがあります。 "profiles"テーブルの各行について、私は最初に、ユーザー名フィールドが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!'; 
      } 
     } 
    } 

それはそれは大きな問題ではないのですが、私のスクリプトは、すべてで開始することは効率的ではありませんテーブルにはわずか50kレコードしかないためです。とにかくこれをmysqlから直接行う方法は何でしょうか?

+0

私の質問はあなたがこれをしたい理由でしょうか?うまく構造化された正規化されたスキーマから、問題を引き起こす可能性が高いものに移行しています。 – liquorvicar

+0

@liquorvicarうん、私はしないことにしました。私の根本的な理由は、Bobの代わりにidを使用するのではなく、mysite.com/profile?user=Bobのように見えるようにすることで、ユーザー名に基づいてユーザーを選択することでした。しかし、数値IDとvarcharのコンテンツの選択が高速で、IDが永遠に変わらないという事実を考慮しなかったので、今代わりに私はmysite.com/profile?user=Bob&id=123のようになります名前とIDは両方ともそこにありますが、私はIDで選択しており、美的/ユーザビリティ上の理由からその名前を持っています。 – TK123

答えて

0

最初のループ内で$ row変数を操作しています。明らかにそれは動作しません。内部ループの変数に別の名前を付けてみてください。

あなたが使用しているほとんどすべての変数は、最初のループの外側で、内部ループ内で同じ名前を使用しているだけでなく、

dbスキーマにも来るidsを使用するクエリはvarchar型の列よりも高速であるため、IDは外部キーであることがユーザー名ではないことが望ましいです。

もう一つの提案は一列のみが存在することになるので、

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

これをしたいと思うなぜあなたは1つのクエリで

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

これを行うことができますです別の質問。

関連する問題