我在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))
不起作用。我很感激任何帮助。
答案 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;