Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从另一列中的所有值更新列集合最长值_Mysql - Fatal编程技术网

Mysql 从另一列中的所有值更新列集合最长值

Mysql 从另一列中的所有值更新列集合最长值,mysql,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

我有如下表格报告:

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
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
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;
我希望列中最长的\u name最长的值来自列名,但仅来自具有相同符号的行,并且仅当最长的\u name为NULL时

因此,根据这些数据,结果如下所示:

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
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
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是否能帮我做到这一点,因为表中只有很少的百万行,所以可能存在内存问题,但仍然值得一试。如果没有其他内容,我将编写PHP脚本,这将一行一行地完成,但这将需要很长时间才能完成,我将不得不在一段时间后再次完成

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

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
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
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更新和从同一个表中选择的错误


以下是.

似乎不适用于提供示例@JuanCarlosOropeza更新了答案和SQL Fiddle。谢谢,这解决了我的问题。尽管如此,在大表上的查询速度非常慢,需要18小时才能运行,但我早就预料到了。是的,由于高容量,它肯定会很慢。另一种方法是将符号和最长的_名称存储在单独的临时表中,使用JOIN执行更新并删除临时表。但是,为此,需要停止对原始表的更新。