Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SQL: benachbarte Datensätze mitselektieren (https://www.delphipraxis.net/136607-sql-benachbarte-datensaetze-mitselektieren.html)

omata 3. Jul 2009 23:20

Re: SQL: benachbarte Datensätze mitselektieren
 
Mit weniger als zwei Unterabfragen wirst du das nicht hinbekommen, weil du den Vor-Vorgänger ermitteln musst, damit sind es automatisch immer 3 Abfrage(Hauptabfrage + 2 Unterabfragen).

omata 3. Jul 2009 23:37

Re: SQL: benachbarte Datensätze mitselektieren
 
Hier noch mal ein Vorschlag...
SQL-Code:
SELECT username, score, land
FROM user
WHERE score >= (SELECT MAX(score)
                FROM user
                WHERE score < (SELECT MAX(score)
                               FROM user
                               WHERE score < (SELECT score
                                              FROM user
                                              WHERE user_id = 1))) LIMIT 5
Edit: Korrektur!

Hedge 4. Jul 2009 00:32

Re: SQL: benachbarte Datensätze mitselektieren
 
Hab es 2 Mal ausprobiert, aber so geht es leider nicht.
Zwar gibt es 5 Ergebnisse, unter denen auch der Auserwählte ist, aber die anderen Ergebnisse sind frei aus der Luft gegriffen.

omata 4. Jul 2009 00:41

Re: SQL: benachbarte Datensätze mitselektieren
 
Hast du meine Korrektur versucht?

Hedge 4. Jul 2009 00:45

Re: SQL: benachbarte Datensätze mitselektieren
 
Weiß nicht was du korrigiert hast, deswegen habe ich es nochmal versucht, aber komme zu dem gleichen Resultat.

omata 4. Jul 2009 00:52

Re: SQL: benachbarte Datensätze mitselektieren
 
Also ich habe folgende Daten angelegt...
Code:
user_id | username | score | land
1       | 1        | 1     | 1   
2       | 2        | 2     | 2     
3       | 3        | 3     | 3
4       | 4        | 4     | 4
11      | 11       | 11    | 11
21      | 21       | 21    | 21
32      | 32       | 32    | 32
Abfrage...
SQL-Code:
SELECT username, score, land
FROM user
WHERE score >= (SELECT MAX(score)
                FROM user
                WHERE score < (SELECT MAX(score)
                               FROM user
                               WHERE score < (SELECT score
                                              FROM user
                                              WHERE user_id = 4))) LIMIT 5
liefert...
Code:
user_id | username | score | land
2       | 2        | 2     | 2     
3       | 3        | 3     | 3
4       | 4        | 4     | 4
11      | 11       | 11    | 11
21      | 21       | 21    | 21
Das sieht doch richtig aus?

Hedge 4. Jul 2009 00:57

Re: SQL: benachbarte Datensätze mitselektieren
 
Ich habs in dem Datenbestand versucht, wo es auch zum Einsatz kommen soll (knapp 6000 Datensätze).

Deine Test-Daten liegen bereits in der Grundreihenfolge sortiert vor. Deshalb funktioniert es wahrscheinlich.

omata 4. Jul 2009 01:00

Re: SQL: benachbarte Datensätze mitselektieren
 
Und wenn du deine Abfrage noch sortierst...
SQL-Code:
SELECT username, score, land
FROM user
WHERE score >= (SELECT MAX(score)
                FROM user
                WHERE score < (SELECT MAX(score)
                               FROM user
                               WHERE score < (SELECT score
                                              FROM user
                                              WHERE user_id = 4)))
ORDER BY score LIMIT 5

Hedge 4. Jul 2009 01:07

Re: SQL: benachbarte Datensätze mitselektieren
 
Ich glaub ich gugg nicht recht.
Das ist des Rätsels Lösung!

Es funzt!!!

Hatte dein Beispiel auch mit Order By erweitert, aber vor lauter Schlaftrunkenheit das LIMIT 5 übersehen, das dann davor stand.

Ich muss allerdings mal ein wenig auf die Performance schauen, weil diese Abfrage auf einer Seite 3 Mal genutzt werden muss.

alcaeus 4. Jul 2009 08:38

Re: SQL: benachbarte Datensätze mitselektieren
 
Moin Hedge,

ausserdem arbeitet MySQL da gleich mit 4 Abfragen...es ist also trotzdem noch performanter, zwei Abfragen zu machen.

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.
Seite 2 von 3     12 3      

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