2009-08-13 7 views
1

私は2列を持つテーブルがあります。私はすべてのエントリは、1つのドメインIDのエントリ、およびドメインのサイトの1を持ちたいSQL - 「Bの場合はBを挿入する」というように「foreach A in table」を実行するクエリはありますか?

nid realm 
1 domain_id 
1 domain_site 
2 domain_id 
3 domain_id 

を。だから私はで終わるしたい:私はPHPでこれをやっていた場合

nid realm 
1 domain_id 
1 domain_site 
2 domain_id 
2 domain_site 
3 domain_id 
3 domain_site  

、私はちょうどリスト全体のforeach、それが存在していなかった時はいつでも余分な行を挿入したいです。残念ながら、私はこのDBにPHPmyAdminアクセスしかありません。 SQLでこれを行う方法はありますか?

(現在のテーブルは約3000行ありますが、2000年には余分な行が挿入されている必要があります)また、これは一度の作業であり、最適化/ユーバースリック)

答えて

2
INSERT IGNORE INTO `table` 
SELECT `alt1`.`nid`, `alt2`.`realm` 
FROM `table` AS `alt1`, `table` AS `alt2` 
+0

ooh、光沢のあるIGNOREキーワード –

+0

これは光沢があります!私はこのコードを理解していないと私が言うことはわかりませんが、私はそれをとにかく使いました!そしてそれは働いた! (私は最初にバックアップしました:) – Eileen

+0

嬉しいです。 :)これは、ほとんどの状況下では非常に悪いことであり、条件なしで参加することです。私は学問用語が何であるか分かりませんが、2つのテーブルのすべての可能な組み合わせが結果として生じるので、それを "爆発的な結合"と考えます。ここでは、一意の制約を持つテーブルに挿入するため、すべてうまく動作します。したがって、気になる固有の組み合わせを取得するだけです。また、IGNOREは、重複した組み合わせを除外します。 – chaos

0

私はこれはそれを行うだろうと思うが、私は今それをテストする場所を持っていないと私は、SQL Serverのではなく、MySQLへの慣れ:。

INSERT INTO `table` 
SELECT id.nid, r.realm 
FROM (SELECT nid FROM `table` GROUP BY nid) id 
CROSS JOIN (SELECT realm FROM `table` GROUP BY realm) r 
LEFT JOIN `table` t ON t.nid=id.nid AND t.realm=r.realm 
WHERE t.realm IS NULL 
0
insert into MyTable 
(nid, realm) 
select nid, 'domain_id' 
from MyTable m where not exists (
    select 1 
    from MyTable 
    where MyTable.nid = m.nid and realm = 'domain_id' 
) 
union all 
select nid, 'domain_site' 
from MyTable m where not exists (
    select 1 
    from MyTable 
    where MyTable.nid = m.nid and realm = 'domain_site' 
) 
0

(nid、realm)以上のUNIQUE制約がある場合は、

INSERT IGNORE INTO nidTable (nid, realm) 
    SELECT nid, 'domain_site' 
    FROM nidTable WHERE realm = 'domain_id'; 
関連する問題