我尝试做的是基于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技能有限。
答案 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;