![]() |
AW: Zum nächsten Datensatz springen
Zitat:
Wie es möglich sein soll, dass die beiden Abfragen ohne NULL Werte in der Datenbank nicht funktionieren, ist mir völlig rätselhaft, eigentlich müsste es auf beide Arten gehen. Ich würde, um ganz sicher zu gehen, einmal drei Update Statements über die Datenbank laufen lassen: update tabelle set name='' where name is null das gleiche für vorname und für gesch_firma, und dann die beiden Abfragen noch einmal ausprobieren. |
AW: Zum nächsten Datensatz springen
Ja tut es.
|
AW: Zum nächsten Datensatz springen
Markus, könntest Du nochmal nach meinem Edit in #40 schauen?
|
AW: Zum nächsten Datensatz springen
@Idefix: Werde ich mal probieren. Du meinst die Statements von DeddyH?
Bei allen drei Updates waren 0 Zeilen betroffen. Es stand also nirgendwo NULL in den betroffenen Feldern. |
AW: Zum nächsten Datensatz springen
Nach genauer Überlegung stimmt es, dass das Statement bei wiederholter Ausführung u.U. immer zwischen 2 DS hin- und herspringen würde. Das könnte man vermeiden, indem man die ID in das künstlich erzeugte Vergleichsfeld mit einbezieht. Aber dazu muss ja erst einmal ein Ergebnis kommen.
|
AW: Zum nächsten Datensatz springen
Zitat:
|
AW: Zum nächsten Datensatz springen
Asche auf mein Haupt. Es sind alle da. Ich hatte beim ersten testen nur in der Mitte angefangen und zufällig wo die Firmen anfangen. Als er dann die Firmen durch hatte, dachte ich die privaten Kontakte würden Fehlen, aber die lagen ja DAVOR. das lag aber auch daran, will ich die Übersichtsliste noch nach der Kategorie (Arzt, Geschäftlich, Privat) sortiert habe. da kommen erst alle Ärze alphabetisch, dann alle Firmen alphabetisch und dann alle privaten Kontakte alphabtisch. Bei dir kommen erst alle privaten Kontakte und dann alle Firmen bzw. Ärzte alphabtisch. Wenn ich kjetzt aus meiner Liste den ersten Kontak aufrufe, das ist ein Arzt, lande ich bei dir am Ende der privaten Kontakte und am Anfang von den Ärzten/Firmen, also am Ende der Liste. Ich glaube mit einem GROUP BY müsste ich das noch hinbiegen können.
Hier die Liste von der aus ich einen Datensatz aufrufen kann:
Code:
Wenn ich jetzt den vorherigen Datensatz haben will, dann muss ich die Größer-/Kleinerzeichen umdrehen und aus ASC DESC machen oder?
"SELECT a.*, k.name as k_name
FROM adressen a LEFT OUTER JOIN adr_kategorien k on k.id = a.kategorie_id WHERE k.name='".$kat."' ORDER BY k.name, a.gesch_firma, a.name, a.vorname |
AW: Zum nächsten Datensatz springen
Nur zur Sicherheit:
nächster DS
SQL-Code:
Vorheriger DS:
SELECT
ID FROM adressen WHERE CONCAT_WS(' ',gesch_firma,name,vorname,CAST(ID AS VARCHAR)) >= (SELECT CONCAT_WS(' ',gesch_firma,name,vorname,CAST(ID AS VARCHAR)) FROM adressen WHERE ID = $id) AND ID <> $id ORDER BY gesch_firma,name,vorname LIMIT 1
SQL-Code:
Wie gehabt ungetestet, sollte aber hoffentlich passen.
SELECT
ID FROM adressen WHERE CONCAT_WS(' ',gesch_firma,name,vorname,CAST(ID AS VARCHAR)) <= (SELECT CONCAT_WS(' ',gesch_firma,name,vorname,CAST(ID AS VARCHAR)) FROM adressen WHERE ID = $id) AND ID <> $id ORDER BY gesch_firma DESC,name DESC,vorname DESC LIMIT 1 [edit] Den sql-Tag hatte ich auch schon versucht, es muss jetzt [ code=SQL ] heißen (ohne Leerzeichen natürlich) [/edit] |
AW: Zum nächsten Datensatz springen
Zitat:
Aber was an der Query von DeddyH falsch ist, würde mich noch interessieren, die schaut mir nämlich ziemlich gleichwertig aus - die vom allerletzten Posting sollte genau das gleiche machen. Oder funktioniert die ohnehin auch? Halt - CAST(ID AS VARCHAR) gehört auch noch in die Order by Klausel angehängt, sonst ist erst wieder ein Pendeln zwischen zwei Datensätzen möglich. |
AW: Zum nächsten Datensatz springen
Jetzt willst du es aber wissen, was? ;) Ich werde deine Version morgen mal ausprobieren. Jetzt muss ich erst mal gucken, dass ich die Sortierreihenfolge der Liste und beim Blätter gleich hinbekomme, sonst ist das etwas verwirrend.
|
AW: Zum nächsten Datensatz springen
Zitat:
|
AW: Zum nächsten Datensatz springen
Irgendwas habe ich übersehen:
SQL-Code:
Ich bekomme immer den ersten Datensatz. Ich brauche aber den vorherigen.
SELECT id 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 DESC limit 0,1 |
AW: Zum nächsten Datensatz springen
Und wenn Du im ORDER BY hinter jedes Feld DESC schreibst?
[edit] Ich kaufe ein "R" :mrgreen: [/edit] |
AW: Zum nächsten Datensatz springen
Was und in welcher Reihenfolge bekommst du denn, wenn du das LIMIT mal wegläßt?
|
AW: Zum nächsten Datensatz springen
Ja, dann funktioniert es.
So, besten Dank für eure Mühe und Geduld. Jetzt habe ich es so, wie ich es haben wollte. |
AW: Zum nächsten Datensatz springen
Kommt das DBMS eigentlich auf die Idee z.B. das
Delphi-Quellcode:
zu cachen, da es doch eventuell doppelt aufgerufen würde?
SELECT gesch_firma FROM adressen WHERE id = $id
Delphi-Quellcode:
würde ja quasi bis zu 6 Mal gesucht.
SELECT gesch_firma, name, vorname FROM adressen WHERE id = $id
Wenn nicht, dann könnte man eventuell nun mit den Optimierungen anfangen. |
AW: Zum nächsten Datensatz springen
SQL-Code:
Vorsicht! Mir ist nicht ganz klar, was Du da genau machen willst, aber mit einem LEFT OUTER JOIN könntest Du Dir theoretisch in der Ergebnis Tabelle NULL Werte in der Spalte k.name einhandeln, die dann in der Folge beim Vergleichen Schwierigkeiten machen werden, wenn es zu einem Datensatz keine passende k.id gibt - aber auf Grund der where Klausel sollte es ja in Wirklichkeit gar kein OUTER JOIN sein, oder?.
LEFT OUTER JOIN adr_kategorien k on k.id = a.kategorie_id
WHERE k.name='".$kat."' ORDER BY k.name, a.gesch_firma, a.name, a.vorname |
AW: Zum nächsten Datensatz springen
Das wird intern mit ziemlicher Sicherheit bereits optimiert, da würde ich mir keine Sorgen machen.
|
AW: Zum nächsten Datensatz springen
Na ja, das ist eine Datenbank für meine privaten Kontakte. Da sind gerade mal 58 Datensätze drin. Da werden wahrscheinlich nie so viele reinkommen, dass man da was optimieren müsste. ;)
|
AW: Zum nächsten Datensatz springen
Du lebst noch ein paar Jahre ... das läppert sich
|
AW: Zum nächsten Datensatz springen
Aber wer will schon freiwillig mit ihm Kontakt aufnehmen? :duck:
|
AW: Zum nächsten Datensatz springen
Moin zusammen,
Ich hatte mir mal vor einiger Zeit eine Pagination-Komponente zusammengebastelt, um eine relativ große Tabelle zu stückeln. Um jetzt die ganzen Problematiken die hier im Thread angesprochen wurden, zu vermeiden habe ich das ganze damals in etwa so gelöst(ich hab' mich mal auf's wesentliche beschränkt und hoffentlich nichts vergessen :)):
Delphi-Quellcode:
In meinen DBGrids ist es so, dass die User die Sortierreihenfolge selbst wählen können und mit dieser Lösung
//Die ersten 100
FLimitStartValue:=0; FLimitRange:=100; SQL := FORMAT('SELECT * FROM table ORDER BY 1,2,3 LIMIT %d,%d',[FLimitStartValue,FLimitRange]); //Die nächsten FLimitStartValue := FLimitStartValue + FLimitRange SQL := FORMAT('SELECT * FROM table ORDER BY 1,2,3 LIMIT %d,%d',[FLimitStartValue,FLimitRange]); kann es mir egal sein wie diese aussieht. |
AW: Zum nächsten Datensatz springen
Es ging nicht um Pagination. Ich wollte von einem zum nächste bzw. vorherigen Datensatz blättern können mit Links.
|
AW: Zum nächsten Datensatz springen
Wenn du die 'Range' auf 1 setzt, dann bekommst du doch
immer den nächsten Datensatz... Da hab' ich dann wohl nicht wirklich verstanden was du vorhast :oops: Wie sieht denn so ein Link aus, bzw was passiert dahinter? |
AW: Zum nächsten Datensatz springen
Ach so. OK, ja, dann hätte ich das, was ich wollte auch mit deiner Lösung. Aber ich habe es ja jetzt.
|
AW: Zum nächsten Datensatz springen
Rapante und MKinzler haben eine Methode vorgeschlagen, die in Deinem Fall (private kleine Datenabnk) auch funktionieren wird. Prinzipiell ist davon aber eher abzuraten, weil bei Mehrbenutzerbetrieb ein unerwünschtes Verhalten auftritt, wenn andere Benutzer in die Datenbank (weiter vorne, Richtung Tabellenanfang) Datensätze einfügen oder löschen, während man sich die Tabelle anschaut und dann weiterblättert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz