MYSQL将行更新为相似行的最大值
我在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列更新为同名行的最大值。因此,结果应该是:
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