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

时间:2017-05-02 19:14:52

标签: mysql sql database

我在MYSQL中有这样的表:

ID   |   NAME    |  VALUE  |
----------------------------
 1   |   Bob     |  1      |
 2   |   Bob     |  2      |
 3   |   Jack    |  5      |
 4   |   Jack    |  8      |
 5   |   Jack    |  10     |

我正在尝试将VALUE列更新为具有相同NAME的行的最高值。所以结果应该是:

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))

不起作用。我很感激任何帮助。

5 个答案:

答案 0 :(得分:1)

这比其他答案更容易实现。

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

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

答案 1 :(得分:0)

创建一个由ID NAME和MAX VALUE组成的临时表,如下所示:

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。

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

答案 2 :(得分:0)

您可以使用此查询。该表与子查询(表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;

此查询将显示table的所有字段,后跟新值maxv。您可以检查当前值和新值,如果它看起来不错,您可以运行UPDATE查询。

答案 3 :(得分:0)

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

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;

答案 4 :(得分:0)

http://sqlfiddle.com/#!9/f79a3/1

UPDATE t1 
INNER JOIN (SELECT name, MAX(`value`) max_value
           FROM t1 GROUP BY name) t2 
ON t1.name = t2.name
SET t1.value = t2.max_value;