2017-01-01 72 views
0

我有这个疑问MySQL的:基于标准的表更新列

SELECT *, min(id) 
FROM mytable 
WHERE col2='specval' 
GROUP BY col3 

是选择我需要的行。

我想设置

UPDATE mytable 
set col4 = col3+1000 

上面分别选择的行。

那么,如何通过在该表中将col4分别设置为col4 = col3 + 1000来分别更新该行?

谢谢。

+2

'select *,min(id)'不会选择每个组中具有最小id的行。它选择最小的id,但其他列来自组中的随机行,而不是具有最小值的同一行。有关如何获取正确的行,请参阅http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column?rq=1。 – Barmar

回答

1

你可以使用这样的查询:

UPDATE mytable 
set col4 = col3+1000 
WHERE id in (
    SELECT * FROM (
    SELECT min(id) 
    FROM mytable 
    WHERE col2='specval' 
    GROUP BY col3 
) as myids 
); 
+2

在mysql中不起作用 – GurV

+1

@Gurwinder Singh - 现在它工作vi派生表 –

0

您也可以在update子句中使用WHERE。因此,根据“选择了”是什么意思你(我是从你的SELECT猜测),你可能会做这样的事情:

UPDATE mytable 
SET col4 = col3+1000 
WHERE col2 = 'specval'; 
+0

呃......'specval'就是这种情况下的问题......它是动态的...... – Haradzieniec

+0

然后你可以插入任何你想要的东西。 –

+0

@Haradzieniec您可以按照您在“SELECT”查询中所做的相同方式动态提供它。 – Barmar

1

你可以使用带有JOIN的UPDATE:

UPDATE mytable t1 
     INNER JOIN 
    (SELECT 
     col3, MIN(id) id 
    FROM 
     mytable 
    GROUP BY col3) t2 ON t1.col3 = t2.col3 AND t1.id = t2.id 
SET 
    t1.col4 = t1.col3 + 1000; 
+0

我更喜欢这个解决方案。这绝对是MySQL的精神。 –