2012-02-14 76 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