echo $begrüßung;
Drei Inserts. Null Selects.
Wie viel besser magst Du es noch haben?
Das Problem an der Geschichte ist, die IDs der bereits vorhandenen Datensätze zu bekommen. Bei einem INSERT IGNORE liefert LAST_INSERT_ID() (bzw. das API-Pendant dazu) nur dann einen brauchbaren Wert, wenn der IGNORE-Fall nicht eintritt.
Alternative Vorgehensweisen:
INSERT IGNORE title SET title='title';
INSERT IGNORE interpret SET interpret='interpret';
INSERT IGNORE stücke SET id_title=(SELECT id FROM title WHERE title='title'), id_interpret=(SELECT id FROM interpret WHERE interpret='interpret');
Man kommt hier um die zwei SELECTs nicht drumrum, versteckt sie aber im dritten INSERT.
(Wobei mir grad auffällt, dass ein Titelname durchaus zwei verschiedene Stücke bezeichnen kann, und da muss der eine noch nicht mal eine Coverversionen des anderen sein. Das so zu normalisieren halte ich für nicht richtig. Ich würde die Titel n:1 dem Interpreten zuordnen.)
Ein zweiter Vorschlag:
INSERT title SET title='title' ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
mysql_insert_id() befragen und Wert merken. Enthalten ist entweder die ID vom eingefügten Satz oder aufgrund der LAST_INSERT_ID(expr)-Arbeitsweise (man beachte den Parameter expr) der Wert von einem bereits vorhandenen Titel.
Das gleiche mit dem Interpreten machen und beide gemerkte ID-Werte im dritten INSERT (mit IGNORE) angeben.
Siehe dazu: INSERT ... ON DUPLICATE KEY UPDATE Syntax
Hier hat man also "Drei Inserts. Null Selects." aber unter Zuhilfenahme der API. In reinem MySQL benötigt man noch eine benutzerdefinierte Variable, um den Title-ID-Wert zwischenzuspeichern. Also hat man effektiv "Drei Inserts. Ein Set."
echo "$verabschiedung $name";