2009-08-13 4 views
1

Ich habe eine Tabelle mit zwei Spalten:SQL - Gibt es eine Abfrage, die "foreach A in Tabelle, wenn! B, einfügen B"?

nid realm 
1 domain_id 
1 domain_site 
2 domain_id 
3 domain_id 

ich jeden Eintrag möge 1 Eintrag für die Domain-ID hat, und 1 für Domain-Website. Deshalb möchte ich mit am Ende:

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

Wenn ich dies in PHP tat, ich würde nur durch die ganze Liste foreach und die zusätzliche Zeile ein, wenn sie nicht vorhanden. Leider habe ich nur PHPmyAdmin Zugriff auf diese DB. Gibt es eine Möglichkeit, dies in direktem SQL zu tun?

(Wenn es einen Unterschied macht. Die Tabelle hat etwa 3000 Zeilen zur Zeit, von denen ich denke etwa 2000 wird die zusätzliche Zeile eingefügt müssen auch diese eine Sache einmalig ist, damit es nicht optimiert werden muss/. uber-Slick)

Antwort

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

ooh, glänzend IGNORE Schlüsselwort –

+0

Das ist glänzend! Ich weiß nicht, was es über mich sagt, dass ich diesen Code nicht einmal verstehe, aber ich habe ihn trotzdem benutzt! Und es hat funktioniert! (Ich habe zuerst gesichert. :) – Eileen

+0

Froh, dass es dir gefällt. :) Es ist etwas, das unter den meisten Umständen sehr schlecht wäre, ein Beitritt ohne Bedingungen; Ich weiß nicht, was der akademische Ausdruck dafür ist, aber ich sehe es als eine "explosive Verbindung" an, weil es zu allen möglichen Kombinationen der beiden Tabellen führt. Hier funktioniert alles gut, weil Sie in eine Tabelle mit einer eindeutigen Einschränkung einfügen, so dass Sie nur die einzigartigen Kombinationen erhalten, die Ihnen wichtig sind, und das 'IGNORE' macht alle doppelten Kombinationen überflüssig. – chaos

0

ich denke, das wird es tun, aber ich habe keinen Platz es jetzt zu testen und ich bin auf SQL Server anstatt MySQL verwendet:

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

Wenn Sie eine UNIQUE Einschränkung über (NID, Realm) haben, Sie könnten dies tun:

INSERT IGNORE INTO nidTable (nid, realm) 
    SELECT nid, 'domain_site' 
    FROM nidTable WHERE realm = 'domain_id'; 
Verwandte Themen