Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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_Sql_Database - Fatal编程技术网

MYSQL将行更新为相似行的最大值

MYSQL将行更新为相似行的最大值,mysql,sql,database,Mysql,Sql,Database,我在MYSQL中有这样一个表: ID | NAME | VALUE | ---------------------------- 1 | Bob | 1 | 2 | Bob | 2 | 3 | Jack | 5 | 4 | Jack | 8 | 5 | Jack | 10 | 我试图将VALUE列更新为同名行的最大值。因此,结果应该是:

我在MYSQL中有这样一个表:

ID   |   NAME    |  VALUE  |
----------------------------
 1   |   Bob     |  1      |
 2   |   Bob     |  2      |
 3   |   Jack    |  5      |
 4   |   Jack    |  8      |
 5   |   Jack    |  10     |
我试图将VALUE列更新为同名行的最大值。因此,结果应该是:

ID   |   NAME    |  VALUE  |
----------------------------
 1   |   Bob     |  2      |
 2   |   Bob     |  2      |
 3   |   Jack    |  10     |
 4   |   Jack    |  10     |
 5   |   Jack    |  10     |
我成功地获得了如下最大值:

SELECT MAX(Value) max FROM `table` GROUP BY Name having count(*) >1 AND MAX(Value) != MIN(Value)
但我不知道如何把它放在我的更新中

Update table set Value = (SELECT MAX(Value) max FROM `table` GROUP BY Name having count(*) >1 AND MAX(Value) != MIN(Value))

不起作用。非常感谢您的帮助。

创建一个由ID名称和最大值组成的临时表,如下所示:

CREATE TEMP TABLE TABLE1 AS 
(SELECT NAME,MAX(Value) value FROM `table` GROUP BY Name having count(*) >1 
AND MAX(Value) != MIN(Value)
);
UPDATE
Table_A
SET
    Table_A.value = Table_B.value
FROM
    `table` AS Table_A
    INNER JOIN TABLE1 AS Table_B
    ON Table_A.NAME = Table_B.NAME
使用此临时表进行更新,如下所示:

CREATE TEMP TABLE TABLE1 AS 
(SELECT NAME,MAX(Value) value FROM `table` GROUP BY Name having count(*) >1 
AND MAX(Value) != MIN(Value)
);
UPDATE
Table_A
SET
    Table_A.value = Table_B.value
FROM
    `table` AS Table_A
    INNER JOIN TABLE1 AS Table_B
    ON Table_A.NAME = Table_B.NAME
另外,这段代码有点近似,因为我不熟悉mysql,但熟悉sql


如果没有帮助,请告诉我。

您可以使用此查询。该表与一个子查询(表t2)联接,该子查询包含要更新表的结果:

UPDATE `table` t1, 
   (SELECT Name, MAX(Value) maxv, MIN(Value) minv
    FROM `table`
    GROUP BY Name
    HAVING COUNT(*)>1 AND maxv != minv) t2
SET t1.Value = t2.maxv
WHERE t1.Name = t2.Name;
如果您想知道如何更新这些值,可以先运行等效的
SELECT
查询:

SELECT t1.*, t2.maxv
FROM `table` t1, 
   (SELECT Name, MAX(Value) maxv, MIN(Value) minv
    FROM `table`
    GROUP BY Name
    HAVING COUNT(*)>1 AND maxv != minv) t2
WHERE t1.Name = t2.Name;

此查询将显示
表的所有字段,后跟新值
maxv
。您可以检查当前值和新值,如果看起来很好,您可以运行
更新
查询。

简单的左连接就可以了。
试试这个,如果有任何疑问,请告诉我

select a.id,a.name,b.value
from
table a
left join
(select name,max(value) as value from table group by name) b
on a.name=b.name;


这比其他答案更简单

UPDATE MyTable AS t1 INNER JOIN MyTable AS t2 USING (Name)
SET Value = GREATEST(t1.Value, t2.Value);

您不必找到最大值。您只需将每一行连接到具有相同名称的行集合,并将该值设置为两个连接行中的较大值。这在某些行上是不可操作的,但它将依次应用于每一行

你是说MIN(value)minvis的名字有误吗?你的意思是从“表”中?你不需要检查id是否不相等吗?t1=name=t2.name会自己检查的对吗?@HiradRoshandel是
name
放错地方了,谢谢。显然,没有必要使用
id
,而是使用了
Name
。我使用了你问题中提供的查询,它返回你想要的最大值。这给了我一个错误。这种类型的子句以前是在Select附近解析的。同样,在你的内心选择中,你没有选择名字,你以后怎么能在克劳塞希望在一步一问中访问它呢?我已经接受了亚历克斯的回答,但我也喜欢你的解决方案+1