2012-02-14 79 views
0

我有這樣更新列從一組最小值

uniqueid |  name | newid | sirname 
----------+-------------+-------+--------- 
    A1 |  Adam | NULL | Danny 
    A2 | Adam (Lee) | NULL | Danny 
    A5 | Adam (Koh) | NULL | Danny 
    B4 |  Bruce | NULL | CK 
    B6 | Bruce (Lee)| NULL | CK 

數據庫如何從group by sirname

我想要的結果更新所有newidmin(unique id)

uniqueid |  name | newid | sirname 
----------+-------------+-------+--------- 
    A1 |  Adam | A1 | Danny 
    A2 | Adam (Lee) | A1 | Danny 
    A5 | Adam (Koh) | A1 | Danny 
    B4 |  Bruce | B4 | CK 
    B6 | Bruce (Lee) | B4 | CK 
+0

如何定義既有數字又有字母的數據的「最小值」? – 2012-02-14 14:52:04

+0

「唯一身份證」的類型是什麼? – Michas 2012-02-14 14:52:23

+0

min()適用於這種類型的唯一ID並且唯一ID是varchar(1個字母有10個數字) – ChongWang87 2012-02-15 13:42:48

回答

0

試試這個UPDATE JOIN

UPDATE 
    (
     SELECT sirname,MIN(uniqueid) min_uniqueid 
     FROM mytable GROUP BY sirname 
    ) A 
    INNER JOIN mytable B 
    USING (sirname) 
SET 
    B.newid = A.min_uniqueid 
; 

對於此查詢工作非常快,請確保您有sirname和UNIQUEID一個複合索引。

如果你沒有這樣的索引,那麼事先運行此:

ALTER TABLE mytable ADD INDEX sirname_uniqueid_ndx (sirname,uniqueid); 

試試看!

-1

如果BD。的不起作用,請嘗試:

Update tableName As a 
    Set newid = 
    (Select uniqueid 
     From tableName As b 
     Where b.sirname = a.sirname 
     Order By uniqueid 
     Limit 1) 
+0

OP希望'uniqueid'值是組'surname'的值而不是'surname'的值例如'uniqueid = B6'的'newID'應該是'CK',但是你的解決方案會使它成爲'B4',PS我不是downvoter – 2012-02-14 14:56:17

+0

@MGA我在再次檢查預期結果後看到你的權利。乍一看,它看起來像是從一個領域到另一個領域的副本。我會更新我的答案。 – James 2012-02-14 14:59:58

2

試試這個:

UPDATE table a 
SET new_id = (SELECT MIN(unique_id) 
       FROM table b 
       WHERE b.sirname = a.sirname) 
+0

這不起作用,它促使我這 「#1093 - 您不能指定目標表'a'在FROM子句中更新」 – ChongWang87 2012-02-15 13:55:07