MySQL比较两个表并使用转置的选择结果更新第二个表

时间:2012-12-18 10:03:38

标签: mysql select insert compare transpose

我构建了以下两个表:

+---------------+---------------+
| name_i        | value         | 
+---------------+---------------+
| 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           |
+---------------+---------------+---------------+---------------+

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

+---------------+---------------+---------------+---------------+
| 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中执行此操作吗?我真的很新,但我猜测需要一个合适的循环。为方便起见,我自己构建了第二个表,但是如果有一种方法可以直接用适当的值构建它,那对我来说就没问题了。

1 个答案:

答案 0 :(得分: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