2017-01-01 70 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的精神。 –