1

より良い助けが得られるように、私が試したことを示す必要があることはわかっていますが、どこから始めればよいかさえわからないため、示すものは何もありません。私はこれを知的な質問に定式化するのにうまくいっていました。私はPHPとMySQLを使用しています:

arpr_customs (`id`, `customfield_id`, `contact_id`, `stamp_create`, `stamp_update`, `field_value`)
arpr_contacts (`id`, `stamp_create`, `stamp_update`, `key`, `email_address`, `title`, `first_name`, `middle_name`, `last_name`, `full_name`, `format_preference`, `company`, `department`, `address_1`, `address_2`, `address_3`, `city`, `state`, `postal_code`, `country`, `alternative_email_address_1`, `alternative_email_address_2`, `alternative_email_address_3`, `phone_number_1`, `phone_number_2`, `phone_number_3`, `mobile_phone_number_1`, `mobile_phone_number_2`, `mobile_phone_number_3`, `fax_number_1`, `fax_number_2`, `fax_number_3`, `referer_id`, `schedule_pid`, `export_pid`, `import_subscribe_ip_address`, `import_subscribe_date_time`, `import_confirm_ip_address`, `import_confirm_date_time`, `import_customs`, `import_confirmed`)

これら 2 つのテーブルを考慮して、その contact_id と customfield_id '3' を含む行が apr_customs にない contact_ids を特定する必要があります。識別したら、arpr_customs にそれぞれの新しい行を挿入する必要があります。「id」は自動インクリメントが許可され、customfield_id は「3」に設定され、「contact_id」は見つかった ID に設定されます。field_value は「Susie」に設定されています

(Susie は、現在所有されていないすべてのアカウントの所有権を取得する営業担当者の名前を表します。) (customfield_id "3" は営業担当者の名前です。)

編集: これをコメントに入れたかったのですが、大きすぎます。私はスペンサーのアドバイスを受けて、複製テーブルに取り組みました。これが実際に私のために働いたものです。ありがとう@スペンサー

INSERT INTO testing_customs (`contact_id`,`stamp_create`,`stamp_update`,`customfield_id`,`field_value`) 
SELECT o.id AS contact_id, 1341602090 as stamp_create, 1341602090 as stamp_update, 3 AS customfield_id,'Susie' AS field_value
FROM arpr_contacts o LEFT JOIN testing_customs u ON u.contact_id = o.id
AND u.customfield_id = 3  WHERE u.id IS NULL 
4

4 に答える 4

1

apr_customs テーブルに「一致する」行がない apr_contacts の行を検索するには (ここでarpr_customs.contact_idは、arpr_contacts.id

SELECT o.id
  FROM arpr_contacts o
  LEFT 
  JOIN arpr_customs u
    ON u.contact_id = o.id
       AND u.customfield_id = 3
 WHERE u.id IS NULL

これは、おなじみの「アンチ結合」パターンです。基本的に、ステートメントは、連絡先からすべての行を取得し、税関から一致するすべての行を取得し、一致した行をすべて破棄することを示しているため、一致しなかった連絡先からの行が残ります。(customs テーブルに NOT NULL 制約を持つ列があることに依存しているので、一致したかどうかをテストできます。ここでは、id列が主キーであると想定していますが、これは絶対にあり得ないことがわかっています。 null. (注: このクエリの実際の実行計画は、私が説明したものとは少し異なりますが、概念的には、それが起こっていることの最終結果です。)

(通常は) 遅い代替手段として、相関サブクエリを使用して同じ結果を取得することもできます。

SELECT o.id
  FROM arpr_contacts o
 WHERE NOT EXISTS (SELECT 1 FROM arpr_customs u 
                    WHERE u.contact_id = o.id 
                      AND u.customfield_id = 3)

または、非常に大きなテーブルでひどいパフォーマンスが必要な場合は、NOT IN 述語を使用できます。(リストに NULL 値が含まれないように注意してください。)

SELECT o.id
  FROM arpr_contacts o
 WHERE o.id NOT IN 
       ( SELECT u.contact_id 
           FROM arpr_customs u
           WHERE u.contact_id IS NOT NULL
             AND u.customfield_id = 3
       )

それはあなたの質問に部分的にしか答えません。

復習しているときに、そのcustomfield_id列の述語を省略していたことに気付きました。修繕

そして、「欠落している」行の挿入には対応していません...

INSERT ... SELECT ... を実行するために、arpr_contacts テーブルの必要な列を取得し、他の列に値を指定できます。

SELECT 部分だけを実行してから (よくわからない場合は)、挿入を受け入れるための代用として一時テーブルを作成することをお勧めします。( から出力を取得しSHOW CREATE TABLE arpr_customs、それを編集できます (外部キー制約を削除し、テーブル名を変更して、それを挿入のターゲットとして使用します。)

INSERT INTO arpr_customs (`contact_id`,`customfield_id`,`field_value`)
SELECT o.id    AS contact_id
     , 3       AS customfield_id
     , 'Susie' AS field_value
  FROM arpr_contacts o
  LEFT
  JOIN arpr_customs u
    ON u.contact_id = o.id
       AND u.customfield_id = 3
 WHERE u.id IS NULL

apr_customs テーブルのid列が AUTO_INCREMENT として定義されている場合、値が自動的に割り当てられます。

于 2012-07-06T21:22:17.677 に答える
0
INSERT INTO arpr_customs (customfield_id,contact_id,field_value)
SELECT '3',arpr_contacts.id,'Susie'
FROM arpr_contacts LEFT JOIN arpr_customs
on arpr_customs.contact_id=apr_contacts.id
where arpr_customs.contact_id is null
于 2012-07-06T21:23:49.143 に答える
0

のようなものを試してください

Insert arpr_customs(Customfield_id,contact_id,field_value)
Select '3',arpr_contacts.id,'Susie'
From arpr_contacts
outer join arpr_customs On arpr_customs.customfield_id = '3' 
          and arpr_customs.contact_id = arpr_contacts.id
where arpr_customs.contact_id is null

基本的には、タイプ「3」の連絡先と税関の外部結合であり、一致するレコードがあるものを除外し、それらを挿入に使用します。

私のMysqlはブリリアントではないので、そこに面白い構文があるかもしれません.

于 2012-07-06T21:23:56.580 に答える
0

not existnot inまたはleft join+is nullクエリを使用して、やりたいことを実行できます。

次のようなものです:

SELECT * FROM arpr_contacts
WHERE id NOT IN (SELECT contact_id FROM arpr_customs)

正確な MySQL 構文はわかりません。

Not Exist/Not In/Left Join の違いについては、このリンクを参照してください。

于 2012-07-06T21:21:55.287 に答える