0

「プロファイル」というテーブルがあります。このテーブルには「user_id」という名前の列があり、名前を「username」に、タイプを 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!';
            }
        }
    }

私のスクリプトは最初からそれほど効率的ではありませんが、テーブルには 50,000 レコードしかないため、それほど大きな問題ではありません。とにかく、mysqlから直接これを行う方法は何ですか?

4

4 に答える 4

0

これを1つのクエリで実行できます

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

なぜこれをやりたいのかは別の問題です。

于 2012-04-12T06:17:21.863 に答える
0

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

そして、最初のループの外側で使用しているほとんどすべての変数が、内側のループ内で同じ名前を使用しているだけではありません。

また、db スキーマに来て、id を使用したクエリは varchar 型の列よりも高速になるため、id をユーザー名ではなく外部キーにすることをお勧めします。

もう1つの提案は、使用する必要がないということです

while($row = mysql_fetch_assoc($query))

1列しかないから

于 2012-04-12T05:04:26.017 に答える
0

Napster が言ったように、$query$row変数を上書きしています。これで当面の問題が解決するはずです。

さらに、while ループ内、while ループ内のクエリは絶対にひどいものです。悪意はありません!私たちは皆、どこかから始めなければなりません。しかし、次回のツールベルトに何かを持っているように、これを JOIN で書き直す方法を強く検討します。

それが役立つことを願っています!

于 2012-04-12T05:08:07.273 に答える
0

テーブル間の関係が間違っていると思います。ユーザー テーブルの user_id にリンクするプロファイル テーブルに外部キーが必要です。Joe などを Michael に変更すると、プロファイル テーブルの対応するレコードが更新されます。

プロファイル テーブル:

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

ユーザー テーブル:

user_id | username
------------------------
1       | Joe
于 2012-04-12T05:11:30.480 に答える