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执行更新并删除临时表。但是,为此,需要停止对原始表的更新。