Delphi-PRAXiS
Seite 1 von 7  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Zum nächsten Datensatz springen (https://www.delphipraxis.net/151967-zum-naechsten-datensatz-springen.html)

Luckie 8. Jun 2010 01:01

Datenbank: MySQL • Version: ? • Zugriff über: PHP

Zum nächsten Datensatz springen
 
Ich versuche gerade mit einem SQL-Statement die ID des nächsten Datensatzes zu bekommen:
Code:
function getNextID($id) {
      $query = "SELECT * FROM adressen
               WHERE
                  (gesch_firma > ( SELECT gesch_firma FROM adressen WHERE id = $id ))
               OR
                  (name > ( SELECT name FROM adressen WHERE id = $id ))               
               OR
                  (vorname > ( SELECT vorname FROM adressen WHERE id = $id ))
               ORDER BY gesch_firma, name, vorname ASC limit 0,1";
      $resPrev = mysql_query ($query);
      $prevID = mysql_fetch_object($resPrev);      
      return $prevID->id;
   }
(OK, das drumherum ist PHP, aber das ist egal.)
Allerdings springt er mir so nur zwischen zwei Datensätzen hin und her. Zu beachten ist, dass nicht immer alle Felder (gesch_firma, name, vorname) einen Wert haben, also leer sein können. Dann sollen die Datensätze der Reihenfolge gesch_firma, name, vorname durchgeblättert werden, so wie sie auch sortiert sind.

Als Vorlage diente mir diese Seite: http://webdesign.tepelmann.com/index...Datensatz.html Aber wenn ich das nur auf das Feld namen beschränke, überspringt er Datensätze.

H4ndy 8. Jun 2010 04:01

AW: Zum nächsten Datensatz springen
 
Ich glaube der verrammelt da was mit der Oder-Verknuepfung.
Trenne das mal in 3 einzelne Abfragen auf und implementiere die Logik selbst
if ($idFirma != "") { $prevID = $idFirma } else { usw.

DeddyH 8. Jun 2010 08:39

AW: Zum nächsten Datensatz springen
 
Ich denke, mit Aggregatfunktionen käme man weiter.
SQL-Code:
SELECT MIN(ID)
FROM Tabelle
WHERE ID > :aktuelle_ID

mkinzler 8. Jun 2010 08:48

AW: Zum nächsten Datensatz springen
 
Oder mit Limitierung

SQL-Code:
SELECT
   TOP 1 ID
FROM
    Tabelle
WHERE
    ID > :aktuelle_ID;

DeddyH 8. Jun 2010 09:44

AW: Zum nächsten Datensatz springen
 
Aber dann müsstest Du zur Sicherheit noch nach ID sortieren, wenn ich gerade keinen Denkfehler mache.

mkinzler 8. Jun 2010 09:53

AW: Zum nächsten Datensatz springen
 
Wer zur Sicherheit besser, obwohl es bei der Id auch so stimmen sollte

idefix2 8. Jun 2010 10:18

AW: Zum nächsten Datensatz springen
 
Delphi-Quellcode:
      $query = "SELECT * FROM adressen
               WHERE
                  (gesch_firma > ( SELECT gesch_firma FROM adressen WHERE id = $id ))
               OR
                  (name > ( SELECT name FROM adressen WHERE id = $id ))              
               OR
                  (vorname > ( SELECT vorname FROM adressen WHERE id = $id ))
               ORDER BY gesch_firma, name, vorname ASC limit 0,1";
So kann das nicht gut gehen:

der 1. Teil des where liefert alle Datensätze, in denen gesch_firma grösser als im aktuellen Datensatz ist.
der 2. Teil liefert ALLE Datensätze, in denen name grösser als im aktuellen Datensatz ist, aber natürlich auch jene, in denen gesch_firma kleiner als im aktuellen Datensatz ist.
Im 3. Teil werden dann noch ALLE Datensätze geliefertt, bei denen der Vorname grösser ist. Damit erhältst du aber eine Menge Sätze, die laut aktueller Sortierfolge vor dem aktuellen Datensatz liegen.

Prinzipiell müsste eine Bedingung bei drei Sortierkriterien a,b und c in etwa so aussehen:

where (a>a0) or ((a=a0) and (b>b0)) or ((a=a0) and (b=b0) and (c>c0))

Zitat:

Zu beachten ist, dass nicht immer alle Felder (gesch_firma, name, vorname) einen Wert haben, also leer sein können.
Wenn Du damit meinst, dass der Wert ein leerer String sein kann, dann ist es egal. Der leere String liegt in der Sortierfolge vor jedem anderen String. Wenn allerdings Werte NULL sein können, wird es wesentlich komplizierter, weil das Ergebnis jedes Vergleichs, in den der Wert NULL involviert ist, als Ergebnis wieder NULL liefert.

Luckie 8. Jun 2010 10:57

AW: Zum nächsten Datensatz springen
 
Zitat:

Zitat von idefix2 (Beitrag 1026756)
Damit erhältst du aber eine Menge Sätze, die laut aktueller Sortierfolge vor dem aktuellen Datensatz liegen.

Deswegen limitiere ich das ja auf einen Datensatz.

[/quote]Prinzipiell müsste eine Bedingung bei drei Sortierkriterien a,b und c in etwa so aussehen:

where (a>a0) or ((a=a0) and (b>b0)) or ((a=a0) and (b=b0) and (c>c0))[/quote]
Aber a0, b0 und c0 habe ich ja nicht.

Zitat:

Wenn Du damit meinst, dass der Wert ein leerer String sein kann, dann ist es egal. Der leere String liegt in der Sortierfolge vor jedem anderen String. Wenn allerdings Werte NULL sein können, wird es wesentlich komplizierter, weil das Ergebnis jedes Vergleichs, in den der Wert NULL involviert ist, als Ergebnis wieder NULL liefert.
Nein, nur Leerstrings.

idefix2 8. Jun 2010 11:05

AW: Zum nächsten Datensatz springen
 
Zitat:

Deswegen limitiere ich das ja auf einen Datensatz.
Es genügt, wenn der eine Datensatz in der Sortierfolge vor dem aktuellen liegt, damit der ganze Algorithmus nicht funktioniert.


Code:
  $query = "SELECT * FROM adressen
               WHERE
                  (gesch_firma > ( SELECT gesch_firma FROM adressen WHERE id = $id ))
               OR
                  ((gesch_firma = ( SELECT gesch_firma FROM adressen WHERE id = $id ))
                    and
                   (name > ( SELECT name FROM adressen WHERE id = $id )))
               OR
                  ((gesch_firma = ( SELECT gesch_firma FROM adressen WHERE id = $id ))
                    and
                   (name = ( SELECT name FROM adressen WHERE id = $id ))
                    and
                   (vorname > ( SELECT vorname FROM adressen WHERE id = $id )))
               ORDER BY gesch_firma, name, vorname ASC limit 0,1";

DeddyH 8. Jun 2010 11:16

AW: Zum nächsten Datensatz springen
 
Es ist übrigens Quatsch, alle Felder abzufragen, wenn man nur die ID braucht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.
Seite 1 von 7  1 23     Letzte »    

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