只更新具有相似特征的一组结果中的一行


update ONLY a row of a group of results with similar characteristics

大家好,

假设我们有一个表,其中的值按组划分,并且我们只想为每个组修改一行。让我们举一些例子,这是开始的情况:

ID   |   CODE   |  DEFAULT   
-----+----------+-----------
1    |   1234   |     0
2    |   1234   |     0
3    |   1234   |     0
4    |   5678   |     0
5    |   5678   |     0
6    |   7777   |     0
7    |   8888   |     0
8    |   8888   |     0
9    |   8888   |     0

,我们想要更新DEFAULT,但每个CODE只更新一次:

ID   |   CODE   |  DEFAULT   
-----+----------+-----------
1    |   1234   |     0
2    |   1234   |     1
3    |   1234   |     0
4    |   5678   |     1
5    |   5678   |     0
6    |   7777   |     1
7    |   8888   |     0
8    |   8888   |     0
9    |   8888   |     1

更新哪一个并不重要,每个CODE只需要一个。

实际上我只能想到一个SELECT DISTINCT然后,有一个循环,采取SELECT ... LIMIT 1然后,如果有一个结果,UPDATE,但它真的是一个肮脏的解决方案…我相信它可以用一个(或一对)查询完成…

任何想法?

您可以在子查询上使用UPDATE语句和JOIN语句,该子查询为每个代码返回一行:

update yourtable t1
inner join
(
  select min(id) minId
  from yourtable
  group by code
) t2
  on t1.id = t2.minid
set t1.`default` = 1

参见SQL Fiddle with Demo