AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FreePascal Die letzte Zeile aus der DB schnell auslesen?
Thema durchsuchen
Ansicht
Themen-Optionen

Die letzte Zeile aus der DB schnell auslesen?

Ein Thema von AlexII · begonnen am 6. Jan 2015 · letzter Beitrag vom 7. Jan 2015
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#1

Die letzte Zeile aus der DB schnell auslesen?

  Alt 6. Jan 2015, 14:29
Datenbank: SQLite • Version: 3 • Zugriff über: SQLite3Connection
Hallo,

kann man die letzte Datenzeile aus der DB ohne einer Schleife auslesen?
Zur Zeit mache ich es so, würde aber die Abfrage etwas verkürzen, Falls machbar ist, da bei vielen Datensätzen kann man Code sehr langsam sein.

Delphi-Quellcode:
    // Die letzte Kundennummer des Teilnehmers auslesen
    SQLQueryLastKNr.Close;
    SQLQueryLastKNr.SQL.Text := 'SELECT knr FROM tbteilnehmer';
    SQLQueryLastKNr.Open;

    while not SQLQueryLastKNr.Eof do
    begin
      LastKNr := SQLQueryLastKNr.FieldByName('knr').AsInteger;
      SQLQueryLastKNr.Next;
    end;
    // Ende

    SQLQuery1.ParamByName('knr').AsInteger := LastKNr + 1;
Danke!
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!

Geändert von AlexII ( 6. Jan 2015 um 14:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Die letzte Zeile aus der DB auslesen?

  Alt 6. Jan 2015, 14:34
Und was kennzeichnet eine letzte Datenzeile aus?
DBs sind mengenorientiert. Solange du nicht definierst was "letzte Datenzeile" ausmachst geht das nicht.
Deine Abfrage wird nur zufälligerweise das gewünschte Ergebnis liefern. Mein Goldkugel sagt mir das du eine Autoinc-ID mitführst und der größte Wert dem letzten eingefügten Datensatz entspricht den du haben willst.

Also ein

Code:
SELECT Max(knr) FROM tbteilnehmer group by knr
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Die letzte Zeile aus der DB schnell auslesen?

  Alt 6. Jan 2015, 14:37
AUTOINCREMENT ist bei mir nur die ID, die Kundennummer nicht, da SQLite AUTOINCREMENT nur ein Mal erlaubt. Ich muss also die Kundennummer selber hoch zählen, daher
Zitat:
SQLQuery1.ParamByName('knr').AsInteger := LastKNr + 1;
Wieso machst Du eigentlich "group by knr"?
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Die letzte Zeile aus der DB schnell auslesen?

  Alt 6. Jan 2015, 14:40
Wieso machst Du eigentlich "group by knr"?
I.d.R. muss man bei Aggregatfunktionen (http://www.w3schools.com/sql/sql_functions.asp) ein Group By machen wenn man sie anwenden will. Im Obigen fall ist das aber falsch aus dem Kopf geschrieben. Lass es einfach weg.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Die letzte Zeile aus der DB schnell auslesen?

  Alt 6. Jan 2015, 14:42
kann man die letzte Datenzeile aus der DB ohne einer Schleife auslesen?
Ja, wie beschrieben mit MAX(), wenn auf dem relevanten Feld (hier die Kundennummer) ein Index existiert.
Je nach Datenbank ist ein absteigend sortierter Index erforderlich wenn es möglichst schnell funktionieren soll.
(InterBase in den mir bekannten Versionen klappert bei MAX und nur aufsteigendem Index noch durch alle Sätze)
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#6

AW: Die letzte Zeile aus der DB schnell auslesen?

  Alt 6. Jan 2015, 14:47
Laut Beschreibung/Überschrift woller er ja nicht die größte Nummer, sondern die Letzte, also
SELECT knr FROM tbteilnehmer ORDER BY xxx DESC LIMIT 1
xxx = akn
oder nach was auch immer die Daten sortiert sein sollen (z.B. insert_date oder so)


Ansonsten wäre sein Code auch irgendwie falsch.
Delphi-Quellcode:
LastKNr := -1; // warum hast du die Variable nicht initialisiert? Was soll denn rauskommen, wenn es keine Datensätze gibt!
while not SQLQueryLastKNr.Eof do
begin
  if LastKNr < SQLQueryLastKNr.FieldByName('knr').AsInteger then
    LastKNr := SQLQueryLastKNr.FieldByName('knr').AsInteger;
  SQLQueryLastKNr.Next;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 6. Jan 2015 um 14:49 Uhr)
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Die letzte Zeile aus der DB schnell auslesen?

  Alt 6. Jan 2015, 14:48
Habe diese Selektion gefunden, die gut funktioniert.

SELECT knr FROM tbteilnehmer WHERE id_teilnehmer=(SELECT MAX(id_teilnehmer) FROM tbteilnehmer)

Die id_teilnehmer hat wohl den Index, die knr nicht wie es scheint.
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#8

AW: Die letzte Zeile aus der DB schnell auslesen?

  Alt 6. Jan 2015, 14:52
SELECT knr FROM tbteilnehmer ORDER BY id_teilnehmer DESC LIMIT 1 (Beschreibung siehe Nachtrag meine letzter Antwort)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Die letzte Zeile aus der DB schnell auslesen?

  Alt 6. Jan 2015, 14:55
Laut Beschreibung/Überschrift woller er ja nicht die größte Nummer, sondern die Letzte, also
SELECT knr FROM tbteilnehmer ORDER BY xxx DESC LIMIT 1
xxx = akn
oder nach was auch immer die Daten sortiert sein sollen (z.B. insert_date oder so)
Zitat:
// Die letzte Kundennummer des Teilnehmers auslesen
Da wahrscheinlich mehrere Teilnehmer vorhanden sind, ist
select max(knr) from tbteilnehmer Group by teilnehmer-id gar nicht so falsch.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
AlexII

Registriert seit: 28. Apr 2008
1.717 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Die letzte Zeile aus der DB schnell auslesen?

  Alt 6. Jan 2015, 14:56
SELECT knr FROM tbteilnehmer ORDER BY id_teilnehmer DESC LIMIT 1 (Beschreibung siehe Nachtrag meine letzter Antwort)
Was heißt "DESC LIMIT 1"?
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 08:32 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