更新列设置另一列

时间:2017-11-06 13:18:43

标签: mysql

我有桌子"报告"像这样:

key | symbol | name   | price | longest_name
1   | a1     | abc    | 1     | NULL
2   | a2     | qwe    | 2     | NULL 
3   | a1     | a      | 5     | NULL
4   | a2     | xyz1   | 4     | something
5   | a3     | zz     | 1     | NULL
6   | a1     | qweasd | 0     | NULL

我希望在列" longest_name"列#34; name"中的最长值,但仅限于具有相同符号的行,如果" longest_name" IS NULL

所以,使用这些数据,结果将如下所示:

key | symbol | name   | price | longest_name
1   | a1     | abc    | 1     | qweasd
2   | a2     | qwe12  | 2     | qwe12
3   | a1     | a      | 5     | qweasd
4   | a2     | xyz    | 4     | something
5   | a3     | zz     | 1     | zz
6   | a1     | qweasd | 0     | qweasd

我尝试了不同的方法,但没有运气,主要是因为我认为我不能同时修改表格并阅读它。

如何通过一个查询来解决这个问题?

老实说,我不确定MySQL是否会为我做这件事,因为桌子上有几百万行,所以可能存在内存问题,但仍值得尝试。如果不出意外,我将编写PHP脚本,这将逐行完成,但需要很长时间才能完成,并且我将在一段时间后再次执行此操作。

1 个答案:

答案 0 :(得分:1)

您可以编写如下更新查询:

UPDATE test t
SET t.longest_name = (
    SELECT a.name 
    FROM (
       SELECT symbol, name
       FROM test t1
       WHERE LENGTH(name) = (
         SELECT MAX(LENGTH(NAME))
         FROM test
         WHERE symbol = t1.symbol
       )
    ) a
    WHERE a.symbol = t.symbol
)
WHERE longest_name IS NULL;

这里的逻辑是使用一个更高级别的嵌套来解决更新和从同一个表中选择的MySQL错误。

这是 SQL Fiddle