MySQL Update记录的第一个实例

时间:2012-07-11 02:51:47

标签: mysql

我尝试做的是基于contact_id更新记录的第一个实例。

我有一个电子邮件地址表和相应的contact_id。每个联系人可能有多个电子邮件地址,因此该表可以包含同一个contact_id的多个实例。

当我点击每个不同的contact_id的第一个实例时,我想将相应的is_primary字段更新为“1”。

只要数据库中的每个人都有一个,我就不太关心最终成为主要电子邮件地址的内容。

表示例:

 contact_id   | email        |      is_primary
---------------------------------------------
 1001         | john@world.com      |0
 1001         | desmond@world.com   |0
 1002         | person@life.com     |0
 1003         | preson@help.com     |0
 1003         | bad@sql.com         |0
 1003         | have@searched.com   |0

所以我要找的结果是:

 contact_id   | email        |      is_primary
---------------------------------------------
 1001         | john@world.com      |1
 1001         | desmond@world.com   |0
 1002         | person@life.com     |1
 1003         | preson@help.com     |1
 1003         | bad@sql.com         |0
 1003         | have@searched.com   |0

尝试过创建临时表并进行macthcing,但查询更新了所有is_primary字段。我知道我错过了一些基本的东西,但我的sql技能有限。

1 个答案:

答案 0 :(得分:3)

这种技术在子查询中将表连接到自身,但它只匹配一行(基于contact_id 电子邮件匹配。诀窍是子查询只返回一个使用MIN的电子邮件地址,理论上第一个按字母顺序排列(不可靠,但你说没关系)。

我测试了这个效果很好。

UPDATE 
  email 
  JOIN (SELECT contact_id, MIN(email) as email 
        FROM email GROUP BY contact_id) as singles 
  USING(contact_id, email) 
set is_primary=1;