Einzelnen Beitrag anzeigen

CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

Elegante Abfrage mit JOIN

  Alt 22. Jul 2009, 14:33
Datenbank: MySQL • Version: 5.0.67 • Zugriff über: mysql.h-Übersetzung
Hallo zusammen,

da der Datenbankserver mir nach ca. 120.000 Quick'n'Dirty-Queries den Saft abdreht, versuche ich gerade folgendes zu vereinfachen:

Ich versuche eine CSV-Datei in meine Datenbank zu importieren. Um Überschneidungen zu vermeiden habe ich ein SELECT-INSERT-SELECT-Konstrukt: Ich versuche einen Datensatz zu erhalten, wenn er nicht da ist, füge ich ihn hinzu und selecte ihn erneut.
Delphi-Quellcode:
      // Existiert die Population in der Datenbank?
      sql := 'SELECT id FROM populations WHERE continent = '+QuotedStr(cont)+' AND popgroup = '+QuotedStr(pop);
      sql_result := frmMain.Database.Query(sql);

      if (frmMain.Database.NumRows(sql_result) = 0) then
      begin
        // Population der Datenbank hinzufügen
        sql := 'INSERT INTO populations (continent, popgroup) VALUES ('+QuotedStr(cont)+', '+QuotedStr(pop)+')';
        frmMain.Database.Query(sql);

        sql := 'SELECT id FROM populations WHERE id = LAST_INSERT_ID()';
        sql_result := frmMain.Database.Query(sql);
      end;

      pop_id := StrToInt(frmMain.Database.FetchRow(sql_result)[0]);
Das ganze gibt es drei Mal in ähnlicher Form. Jetzt weiß ich, dass ich durch
INSERT IGNORE INTO populations (continent, popgroup) VALUES (:cont, :pop) Zumindest das SELECT übergehen kann. Jetzt verhält sich LAST_INSERT_ID(); beim IGNORE nicht so, wie ich mir das wünschen würde. D.h. ich brauche einen Weg, an die ID des Datensatzes heran zu kommen, unabhängig davon, ob er schon da war oder gerade hinzugefügt wurde. Ich muss später nämlich einen Eintrag in eine andere Tabelle einfügen, wo die ID als Fremdschlüssel verwendet wird.

Irgendwie muss ich da mit JOINts hantieren.
Kann mir da mal jemand kurz erklären, wie ich das machen muss?

Dank und Gruß
Christopher

PS: Ja, dass ich prepared Statements verwenden sollte, weiß ich. Das implementiere ich auch gerade nebenher.
  Mit Zitat antworten Zitat