3

次の2つのテーブルを作成しました。

+ --------------- + --------------- +
| name_i | 値|
+ --------------- + --------------- +
| name_1 | asdf |
| name_1 | fdsd |
| name_1 | fsfd |
| name_2 | ffff |
| name_3 | erfe |
| name_3 | ewrw |
| name_4 | wree |
| name_5 | wr4e |
+ --------------- + --------------- +

+ --------------- + --------------- + --------------- +- -------------- +
| name_id | column1 | column2 | column3 |
+ --------------- + --------------- + --------------- +- -------------- +
| name_1 | null | null | null |
| name_2 | null | null | null |
| name_3 | null | null | null |
| name_4 | null | null | null |
| name_5 | null | null | null |
+ --------------- + --------------- + --------------- +- -------------- +

最初のテーブルの値を転置し、列を比較した結果に応じて2番目のテーブルを更新したいと思いname_idます。name_id値が3未満の場合、残りはNULL2番目のテーブルに残すことができます。したがって、最終的に私のテーブルは次のようになります。

+ --------------- + --------------- + --------------- +- -------------- +
| name_id | column1 | column2 | column3 |
+ --------------- + --------------- + --------------- +- -------------- +
| name_1 | asdf | fdsd | fsfd |
| name_2 | ffff | null | null |
| name_3 | erfe | ewrw | null |
| name_4 | wree | null | null |
| name_5 | wr4e | null | null |
+ --------------- + --------------- + --------------- +- -------------- +

mysqlでこれを行う方法はありますか?私はこれで本当に新しいですが、適切なforループが必要だと思います。便宜上、2番目のテーブルを自分で作成しましたが、適切な値を使用して直接作成する方法があれば、問題ありません。

4

1 に答える 1

2

1つのクエリでは次のようになります

UPDATE table2 SET 
    column1 = (SELECT `value` FROM table1 WHERE name_i = name_id LIMIT 1), 
    column2 = (SELECT `value` FROM table1 WHERE name_i = name_id LIMIT 1,1),
    column3 = (SELECT `value` FROM table1 WHERE name_i = name_id LIMIT 2,1)

3列構造の場合のみ注意してください。必要に応じて追加してください。比較的遅いですが、30000レコードで作業する限り、それほど多くはありません

UPDこれは速くなります

UPDATE table2 
    LEFT JOIN table1 a ON a.name_i = name_id 
    LEFT JOIN table1 b ON a.name_i=b.name_i AND a.value != b.value 
    LEFT JOIN table1 c ON a.name_i=c.name_i AND a.value != c.value AND b.value != c.value 
SET 
    column1 = a.value,
    column2 = b.value,
    column3 = c.value
于 2012-12-18T11:43:38.243 に答える