MySQL Fügen Sie für jede Zeile mit einem Spaltenwert A eine neue Zeile mit einem Spaltenwert B hinzu, falls noch keiner vorhanden ist - mysql

Ich habe einen Tisch mit Säulen id, foo_id, und bar_id.

Ich möchte durch den Tisch gehen und für jeden klar foo_id, wenn es eine Zeile dafür gibt foo_id mit einem bar_id gleich 2, möchte ich eine neue Zeile hinzufügen foo_id und mit a bar_id gleich 3, außer eine Zeile damit foo_id und bar_id von 3 existiert bereits.

Beispielsweise:

Vor:

id | foo_id | bar_id
--------------------
1  | 1      | 1
2  | 1      | 2
3  | 2      | 2
4  | 2      | 3
5  | 3      | 2
6  | 4      | 1

Nach:

id | foo_id | bar_id
--------------------
1  | 1      | 1
2  | 1      | 2
3  | 2      | 2
4  | 2      | 3
5  | 3      | 2
6  | 4      | 1
7  | 1      | 3
8  | 3      | 3

Ich habe diese Abfrage versucht, aber es dauert sehr lange (> 20 min) und ich weiß nicht, ob es funktioniert:

INSERT INTO mytable (bar_id, foo_id)
SELECT 3, (@var := foo_id) AS foo_id FROM mytable
WHERE bar_id=2 AND NOT EXISTS (
SELECT 1 FROM mytable
WHERE bar_id=3 AND [email protected]
) LIMIT 1;

Weiß jemand, was ich tun soll?

Antworten:

1 für die Antwort № 1

Versuche dies:

 INSERT INTO mytable (bar_id, foo_id)
SELECT 3, foo_id
FROM mytable
WHERE bar_id=2 AND foo_id NOT IN (
SELECT foo_id FROM mytable WHERE bar_id=3
);