Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [MySQL] Rangliste (https://www.delphipraxis.net/46201-%5Bmysql%5D-rangliste.html)

faux 20. Mai 2005 13:35


[MySQL] Rangliste
 
Hallo!

Ich möchte wissen, welchen "Rang" der Datensatz der `id` x hat, wenn man nach dem feld `test` sortieren würde.

also meine Tabelle:

Code:
+----+------+
| id | test |
+----+------+
|  1 |   34 |
|  2 |   54 |
|  3 |  543 |
|  4 |  411 |
|  5 |  154 |
|  6 |  156 |
|  7 |   15 |
|  8 |  185 |
|  9 |   10 |
| 10 |    4 |
| 11 |    1 |
| 12 |  441 |
| 13 |  171 |
| 14 |   71 |
| 15 |   73 |
| 16 |   91 |
+----+------+
ich will jetzt zb wissen, welchen "rang" der datensatz mit der id 12 hat, wenn man die tabelle nach test sortieren würde....
in PHP ist das ja kein Problem, nur die Geschwindigkeit. Denn ich hab über 2000 Datensätze... Die Frage wäre jetzt, ob man das ganze in MySQL lösen kann.....

Danke schon mal...

barf00s 20. Mai 2005 13:54

Re: [MySQL] Rangliste
 
2k datensätze?
ist doch noch relativ wenig, das sollte doch deine mysql datenbank locker & fix schaffen...

also sortierst spalte "test"


~hoffentlich laber ich jetz kein müll~

faux 20. Mai 2005 14:01

Re: [MySQL] Rangliste
 
Hat doch niemand gesagt, dass SQL das nicht schafft, oder???
Die frage ist nur WIE geht das.

barf00s 20. Mai 2005 14:05

Re: [MySQL] Rangliste
 
"select id, test from DEINETABELLE order by test"

alcaeus 20. Mai 2005 14:07

Re: [MySQL] Rangliste
 
Hallo faux,

wenn du das Ganze in PHP machst, kannst du dir mit einem Trick helfen, denn mit SQL geht das AFAIK nicht. Nehmen wir an deine Datensätze sind nun in einem assoziativen Array gespeichert, und zwar nach Test sortiert (siehe vorherigen Beitrag). Die Spalte 'id' speichert die Datensatz-ID ebenso für alle anderen Spalten (eben so wie du ein Array von MySQL zurückbekommst ;))

Nun lässt du gleich nach dem Query eine Schleife drüberlaufen:
$indexarray = array();
Code:
for ($i = 0; $i < count($deinarray); $i++)
{
  $indexarray[$deinarray['id']] = $i;
}
Nun kannst du die Positon im array des Datensatzes mit einer bestimmten ID erfragen:
Code:
$someindex = $indexarray[736];
Wichtig: dieser Trick ist nur schneller wenn du mehr als 1 Position überprüfen musst. In dem Fall bist du gleich schnell, direkt übers array zu laufen und abzufragen. Bei mehreren Abfragen ist es so aber definitiv schneller.

Greetz
alcaeus

barf00s 20. Mai 2005 14:10

Re: [MySQL] Rangliste
 
verstehe ^^ ... delphiboard - php - da werden sie geholfen

faux 20. Mai 2005 14:12

Re: [MySQL] Rangliste
 
So hab ich das schon gelöst... Nur hast du bei deiner Variante vergessen, dass auch doppelte Werte von `test` vorkommen können...

Nachdem das in MySQL nicht lösbar ist (was ja die eigentliche frage (wegen der performance) war) hat sich das erübrigt....

Danke, trotzdem...

@barf00s: du solltest die Fragestellung besser lesen...

barf00s 20. Mai 2005 14:14

Re: [MySQL] Rangliste
 
schonklar ich entschuldige mich auch für meine äußerst unqualifizierte antwort, aber wenn ich das noch bemerken dürfte
in deiner "sogenannten" fragestellung kommt kein einziges fragezeichen vor ~spitzfindig~ :)

alcaeus 20. Mai 2005 14:17

Re: [MySQL] Rangliste
 
Zitat:

Zitat von faux
So hab ich das schon gelöst... Nur hast du bei deiner Variante vergessen, dass auch doppelte Werte von `test` vorkommen können...

Ich? Das Feld test wird bei mir (außer für die Sortierung) nicht verwendet. Gleiche Werte bei der Sortierung müssen evtl. über einen zweiten Sort-Parmeter erledigt werden (SELECT * FROM Foo ORDER BY FOO, BAR).

Zitat:

Zitat von barfoos
verstehe ^^ ... delphiboard - php - da werden sie geholfen

Für gelegentliche Fragen haben wir diese Sparte, deshalb ist die Frage durchaus in Ordnung ;)

Und jetzt zickt euch bitte nicht wegen unqualifizierten Fragen/Antworten an ;) Danke

Greetz
alcaeus

faux 20. Mai 2005 14:26

Re: [MySQL] Rangliste
 
eben.

Schau mal:

Code:
mysql> select * from test;
+----+------+
| id | test |
+----+------+
|  1 |    5 |
|  2 |   21 |
|  3 |   10 |
|  4 |    1 |
|  5 |    5 |
|  6 |    3 |
|  7 |   51 |
+----+------+
7 rows in set (0.00 sec)

mysql> select * from test order by test;
+----+------+
| id | test |
+----+------+
|  4 |    1 |
|  6 |    3 |
|  1 |    5 |
|  5 |    5 |
|  3 |   10 |
|  2 |   21 |
|  7 |   51 |
+----+------+
7 rows in set (0.00 sec)
Da haben die Datensätze 1 und 5 jeweils den wert 5 in test. Also steht dann beim Datensatz 1 als "rang" 3 und beim Datensatz 5 steht als "Rang" aber 4, obwohl sie beide 3 bekommen sollten, weißt du was ich meine??


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 Uhr.
Seite 1 von 2  1 2      

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