Mysql 使用另一列的最大值更新

Mysql 使用另一列的最大值更新,mysql,sql,Mysql,Sql,我有一张表格说明了风险: id | state | municipally | rating 例如: id | state | municipally | rating 1 AG AG1 5 2 AG AG2 6 3 AG AG3 2 4 AG AG4 1 5 AG OTHER - 6

我有一张表格
说明了风险

id | state | municipally | rating 
例如:

id | state | municipally | rating 
 1     AG     AG1            5
 2     AG     AG2            6
 3     AG     AG3            2
 4     AG     AG4            1
 5     AG     OTHER          -
 6     AB     AB1            0.2
 7     AB     AB2            2
 8     AB     AB3            10
 9     AB     OTHER          -

我需要更新
市政=OTHER
的值“rating”,按状态“AG”-“AB”设置
MAX(rating)
值,例如:id 5将值设置为6,因为它是状态AG的最大值。

这将为您提供最大值

 SELECT state, max(rating) as maxrating
 FROM states_risk
 GROUP BY state
这将为您提供要更新的内容

 SELECT id, state
 FROM states_risk
 WHERE municiplally = 'OTHER'
所以更新是

 UPDATE states_risk
 SET rating = (
   SELECT max(rating) as maxrating
   FROM states_risk inner
   WHERE inner.state = states_risk.state
 )
 WHERE municiplally = 'OTHER'

您可以通过将表连接到一个查询来完成此操作,该查询返回每个状态的最大评级:

update states_risk s inner join (
  select state, max(rating) rating
  from states_risk
  group by state
) g on g.state = s.state
set s.rating = g.rating
where s.municipally = 'OTHER';
请参阅。
结果:


如果您在他的列中添加了“-”。 您还需要强制转换该列 喜欢

id |州|市|评级 -: | :---- | :---------- | :----- 1 | AG | AG1 | 5 2 | AG | AG2 | 6 3 | AG | AG3 | 2 4 | AG | AG4 | 1 5 | AG |其他| 6 6 | AB | AB1 | 0.2 7 | AB | AB2 | 2 8 | AB | AB3 | 10 9 | AB |其他| 10
dbfiddle

请避免用大写字母书写标题;这给人的印象是你在大喊大叫,人们不会想帮助对他们大喊大叫的人。好的,谢谢你@Timlewis没问题!那么,对于您的问题,您是否尝试过编写任何查询来尝试解决这个问题?您收到的具体问题是什么?
| id  | state | municipally | rating |
| --- | ----- | ----------- | ------ |
| 1   | AG    | AG1         | 5      |
| 2   | AG    | AG2         | 6      |
| 3   | AG    | AG3         | 2      |
| 4   | AG    | AG4         | 1      |
| 5   | AG    | OTHER       | 6      |
| 6   | AB    | AB1         | 0.2    |
| 7   | AB    | AB2         | 2      |
| 8   | AB    | AB3         | 10     |
| 9   | AB    | OTHER       | 10     |
select version();
| version() | | :-------- | | 8.0.18 |
CREATE TABLE states_risk
    (`id` int, `state` varchar(2), `municipally` varchar(5), `rating` varchar(3))
;
INSERT INTO states_risk
    (`id`, `state`, `municipally`, `rating`)
VALUES
    (1, 'AG', 'AG1', '5'),
    (2, 'AG', 'AG2', '6'),
    (3, 'AG', 'AG3', '2'),
    (4, 'AG', 'AG4', '1'),
    (5, 'AG', 'OTHER', '-'),
    (6, 'AB', 'AB1', '0.2'),
    (7, 'AB', 'AB2', '2'),
    (8, 'AB', 'AB3', '10'),
    (9, 'AB', 'OTHER', '-')
;
✓ ✓
Select * From states_risk;
id | state | municipally | rating -: | :---- | :---------- | :----- 1 | AG | AG1 | 5 2 | AG | AG2 | 6 3 | AG | AG3 | 2 4 | AG | AG4 | 1 5 | AG | OTHER | - 6 | AB | AB1 | 0.2 7 | AB | AB2 | 2 8 | AB | AB3 | 10 9 | AB | OTHER | -
SELECT state, MAX(CAST(rating as FLOAT)) MAXrating 
                              FROM states_risk WHERE rating <> '-' GROUP BY state
state | MAXrating :---- | --------: AG | 6 AB | 10
UPDATE states_risk sr INNER JOIN (SELECT state, MAX(CAST(rating as FLOAT)) MAXrating 
                              FROM states_risk WHERE rating <> '-' GROUP BY state) t1 
                              ON sr.state = t1.state
SET sr.rating = t1.MAXrating WHERE sr.municipally = 'OTHER';
Select * From states_risk;
id | state | municipally | rating -: | :---- | :---------- | :----- 1 | AG | AG1 | 5 2 | AG | AG2 | 6 3 | AG | AG3 | 2 4 | AG | AG4 | 1 5 | AG | OTHER | 6 6 | AB | AB1 | 0.2 7 | AB | AB2 | 2 8 | AB | AB3 | 10 9 | AB | OTHER | 10