我构造了以下两个表:
+---------------+---------------+ |name_i |价值 | +---------------+---------------+ |name_1 |ASDF | |name_1 |FDSD | |name_1 |FSFD | |name_2 |FFFF | |name_3 |艾尔夫 | |name_3 |EWRW | |name_4 |雷 | |name_5 |WR4e | +---------------+---------------+ +---------------+---------------+---------------+---------------+ |name_id |专栏1 |列 2 |列 3 | +---------------+---------------+---------------+---------------+ |name_1 |空 |空 |空 | |name_2 |空 |空 |空 | |name_3 |空 |空 |空 | |name_4 |空 |空 |空 | |name_5 |空 |空 |空 | +---------------+---------------+---------------+---------------+
我想转置第一个表中的值,并根据比较其name_id
列的结果更新第二个表。对于那些值少于 3 的name_id
,其余的可以保留在第二个表上NULL
。所以最后我的表格应该看起来像这样:
+---------------+---------------+---------------+---------------+ |name_id |专栏1 |列 2 |列 3 | +---------------+---------------+---------------+---------------+ |name_1 |ASDF |FDSD |FSFD | |name_2 |FFFF |空 |空 | |name_3 |艾尔夫 |EWRW |null | |name_4 |雷 |空 |空 | |name_5 |WR4e |空 |空 | +---------------+---------------+---------------+---------------+
知道如何在mysql中执行此操作吗?我在这方面真的很新,但我猜需要一个合适的 for 循环。为了方便起见,我自己构建了第二个表,但如果有一种方法可以直接使用适当的值构造它,那对我来说很好。
在一个查询中,它将是
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