3

我已经构建了以下两个表:

+---------------+---------------+
| name_i | 价值 |
+---------------+---------------+
| 名称_1 | 阿斯达夫 |
| 名称_1 | fdsd |
| 名称_1 | fsfd |
| 名称_2 | ffff |
| 名称_3 | 埃尔费 |
| 名称_3 | ewrw |
| name_4 | 雷|
| 名称_5 | wr4e |
+---------------+---------------+

+---------------+---------------+---------------+- --------------+
| name_id | 第 1 列 | 第 2 列 |第 3 列 |
+---------------+---------------+---------------+- --------------+
| 名称_1 | 空 | 空 |空 |
| 名称_2 | 空 | 空 |空 |
| 名称_3 | 空 | 空 |空 |
| name_4 | 空 | 空 |空 |
| 名称_5 | 空 | 空 |空 |
+---------------+---------------+---------------+- --------------+

我想转置第一个表中的值并根据比较它们的name_id列的结果更新第二个表。对于那些name_id小于 3 个值的 s,其余的可以保留NULL在第二个表上。所以最后我的表应该是这样的:

+---------------+---------------+---------------+- --------------+
| name_id | 第 1 列 | 第 2 列 |第 3 列 |
+---------------+---------------+---------------+- --------------+
| 名称_1 | 阿斯达夫 | fdsd |fsfd |
| 名称_2 | ffff | 空 |空 |
| 名称_3 | 埃尔费 | ewrw |null |
| name_4 | 雷| 空 |空 |
| 名称_5 | wr4e | 空 |空 |
+---------------+---------------+---------------+- --------------+

知道如何在 mysql 中执行此操作吗?我对此真的很陌生,但我猜需要一个合适的 for 循环。为方便起见,我自己构建了第二张表,但如果有办法直接用适当的值构建它,那对我来说没问题。

4

1 回答 1

2

在一个查询中,它将是

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 回答