1

我试图做的是根据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

已尝试创建一个临时表并对其进行处理,但查询更新了所有 is_primary 字段。我知道我在这里缺少一些基本的东西,但是我的 sql 技能是有限的。

4

1 回答 1

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;
于 2012-07-11T03:19:31.253 回答