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と電子メールの一致に基づいて) 1 つの行のみに一致します。トリックは、サブクエリが MIN を使用して電子メール アドレスの 1 つだけを返すことです。理論的にはアルファベット順で最初のものです (信頼性が低く、しかし、あなたはそれは問題ではないと言いました)。

私はこれをテストしましたが、良い結果が得られました。

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 に答える