AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Elegante Abfrage mit JOIN
Thema durchsuchen
Ansicht
Themen-Optionen

Elegante Abfrage mit JOIN

Ein Thema von CalganX · begonnen am 22. Jul 2009 · letzter Beitrag vom 2. Aug 2009
Antwort Antwort
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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Elegante Abfrage mit JOIN

  Alt 22. Jul 2009, 14:38
Kann es sein, das wenn der Insert weil schon vorhanden ignoriert wird auch keine ID zurückgegeben wird?
Markus Kinzler
  Mit Zitat antworten Zitat
CalganX

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

Re: Elegante Abfrage mit JOIN

  Alt 22. Jul 2009, 14:40
Ja, richtig. Deswegen muss ich ja einen JOIN reinbasteln, damit ich beim nächsten INSERT auf die ID zugreifen kann:
Delphi-Quellcode:
      // Existiert der Datensatz in der Datenbank?
      sql := 'SELECT id FROM datasets WHERE population_id = '+IntToStr(pop_id)+' AND system_id = '+IntToStr(syst_id);
      sql_result := frmMain.Database.Query(sql);

      if (frmMain.Database.NumRows(sql_result) = 0) then
      begin
        // Datensatz in die Datenbank einfügen
        sql := 'INSERT INTO datasets (population_id, system_id, population_size) VALUES ('+IntToStr(pop_id)+', '+IntToStr(syst_id)+', '+IntToStr(popsize)+')';
        frmMain.Database.Query(sql);

        sql := 'SELECT id FROM datasets WHERE id = LAST_INSERT_ID()';
        sql_result := frmMain.Database.Query(sql);
      end;
Da brauche ich ja pop_id wieder.
  Mit Zitat antworten Zitat
Freiwilderer

Registriert seit: 26. Mai 2009
163 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Elegante Abfrage mit JOIN

  Alt 22. Jul 2009, 15:12
hi,
ich bin nich ganz sicher, dass ich das problem richtig verstanden habe ... aber wenn ich das lösen müsste, so, wie ich glaube, dass du das meinst würde ich die id einfach in ne lokale variable packen ... oder gibts dabei n problem ?

etwa so:

Delphi-Quellcode:
var
AktuelleID : Integer;
// 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);

      AktuelleID := sql.fieldbyname('id').asInteger;

      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);
        AktuelleID := sql.fieldbyname('id').asInteger;
      end;

      pop_id := StrToInt(frmMain.Database.FetchRow(sql_result)[0]);
      irgendwas := AktuelleID;
oder, was spricht dagegen ?

mfg
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Elegante Abfrage mit JOIN

  Alt 22. Jul 2009, 19:10
Führe die erste Query einfach nach dem INSERT wieder aus.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
CalganX

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

Re: Elegante Abfrage mit JOIN

  Alt 2. Aug 2009, 13:28
Hi,

@alzaimar: Das Problem ist, dass ich insgesamt Queries sparen musste, da mir nach 30.000 Datensätzen die Verbindung zum Server verloren geht.

Habe es jetzt mit verschachtelten Queries gelöst:
INSERT IGNORE INTO datasets (population_id, system_id, population_size) VALUES ( (SELECT id FROM populations WHERE continent = :continent AND popgroup = :popgroup), (SELECT id FROM systems WHERE name = :system), :popsize ) Gruß
Christopher
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Elegante Abfrage mit JOIN

  Alt 2. Aug 2009, 13:44
Zitat:
Das Problem ist, dass ich insgesamt Queries sparen musste, da mir nach 30.000 Datensätzen die Verbindung zum Server verloren geht.
Warum den das?
Markus Kinzler
  Mit Zitat antworten Zitat
CalganX

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

Re: Elegante Abfrage mit JOIN

  Alt 2. Aug 2009, 21:58
Frag mich nicht. Die Verbindung war einfach weg. Konnte zwar direkt wieder aufgebaut werden (d.h. der Server ist nicht abgestürzt), aber mitten in der Verarbeitung war sie erstmal weg. Möglicherweise irgendeine Einstellung am Server. Gab aber auch keine Hinweise in den Logs.
Letztlich hat der Weg mit den Sub-Queries aber auch dazu geführt, dass die Verarbeitung insgesamt deutlich schneller geht. Von daher habe ich da nicht weiter nachgeforscht.

Gruß
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz