| Autor |
Thema: Eine MySQL-Query soll es sein ... |
| >1< [ 2 ] |
05.10.2003 - 18:55:43 #0001
XCS CptnKiff Fleet Admiral
         
 new |
MySQL-Experten vor:
ich habe eine tabelle mit daten (oh wunder!), in diesem fall sind es quizpunkte von meinem irc-quizbot. diese tabelle möchte ich sortieren und danach wissen, an welcher rangposition sich ein bestimmter datensatz befindet.
meine bisherigen lösungen, mit denen ich aber nicht zufrieden bin:
1.) tabelle sortieren, danach sequentiell auslesen, bis ich zufällig den gesuchten datensatz auslese. bei jedem lesevorgang setze ich eine zählvariable eins rauf, so dass mir diese variable den rang anzeigt, sobald der datensatz gefunden wurde.
2.) zusätzlich spalte "rang" einführen. diese spalte müsste aber bei jeder punktevergabe überprüft/aktualisiert werden.
ich suche nach einer einfachen query, also sowas wie "SELECT RANK(spalte="WERT") FROM table SORT BY spalte" nur dass es die RANK-Funktion leider nicht gibt :(
[ ∧ ]
|
05.10.2003 - 19:45:28 #0002
TTL Garmon Fleet Captain
 new |
ohje, das selbe/aehnliche problem hatte ich imo bei den "most played maps" auf der clanseite, ich hab leider nie ne "anstaendige" moeglichkeit gefunden, nur die von dir genannte 2te moeglichkeit oder ueber ne schleife, die aber imo viel zu aufwenidg war fuer die "kleine" sache.
naja, vielleicht kommt ja noch nen mysql guru der dir weiter helfen kann :)
[ ∧ ]
|
05.10.2003 - 19:46:48 #0003
TEG white- Fleet Admiral
         
 *ist immer schuld* new |
erstens wenn wenig Lesevorgaenge zu erwarten sind oder 2. wenn du viel lesen willst. Lieber eimal reorganisieren dann aber die Daten schnell lesen koennen als fuer jeden Lesevorgang alles reorganiesieren muessen. Bei solchen grossen Updateaktionen nicht den LOCK vergessen, sonst kanns passieren das alles durcheinander kommt.
Ich glaube nicht das du es einfach mit einem Query rausbekommst.
cya later
/white-
--
"There are only 10 types of people in the world: Those who understand binary, and those who don´t."
allround daredevil
Tactical Enforcement Group
[ ∧ ]
|
05.10.2003 - 19:59:52 #0004
TEG white- Fleet Admiral
         
 *ist immer schuld* new |
@garmon
most played maps sollte doch aber nicht so schwer sein oder? Bei uns ist es so das es fuer jedes match einen row gibt. Und da ein feld map1, map2 map3. Ich weis das ist doof, aber ist halt schon steinalt
SELECT
count(map1) AS cnt, map1
FROM
matches
GROUp BY
map1 ORDER BY cnt DESC
LIMIT 5;
das wuerde dir die Top5 geben. Allerdings nur fuer map1. In einer ordentlichen Tabelle waere aber fuer jede Map eine Row. Also geh ich mal von aus das bei dir so ist
cya later
/white-
--
"There are only 10 types of people in the world: Those who understand binary, and those who don´t."
allround daredevil
Tactical Enforcement Group
[ ∧ ]
|
05.10.2003 - 20:06:32 #0005
TTL Garmon Fleet Captain
 new |
@white hmm, hast recht *grummel*. hab aber natuerlich auch keine anstaendigen tabellen und map1,map2,map3 in einer reihe :P
oehm, oder hab ich das mal geaendert *unsicher ist* ach auch egal, die seite ist eh down *G*
@ kiff:vielleicht hilft das weiter
[ ∧ ]
|
05.10.2003 - 21:53:18 #0006
XCS CptnKiff Fleet Admiral
         
 new |
vielen dank für eure antworten :)
garmon: mysql_row_SEEK (nicht tell) scheint in etwa das zu sein, was ich brauche. leider ist die API nur für C und nicht für PHP (worin ich den bot schreibe). vermutlich tut die funktion ohnehin nur das, was ich unter 1.) beschrieben hatte. also einfacher zu programmieren, aber immer noch genauso performanceintensiv ...
[ ∧ ]
|
05.10.2003 - 23:20:48 #0007
otaku Spinner Fleet Admiral
     
 new |
erm, gibts RANK() echt net... dacht das wär SQL und da gibts RANK() nämlich mit sicherheit.
mfg Spinner
[ ∧ ]
|
05.10.2003 - 23:26:58 #0008
TEG white- Fleet Admiral
         
 *ist immer schuld* new |
es gibt die funktion mysql_data_seek() was warscheinlich ein wrapper auf die aus der C API ist. Allerdings nuetzt die auch das nix. Da es wie in de Docu auch steht nur der Zeiger auf ein Element des Results gesetzt wird.
Was rank() in SQl macht weis ich nicht ;) ist das SQL92 oder irgendein Psydosstandard?
cya later
/white-
--
"There are only 10 types of people in the world: Those who understand binary, and those who don´t."
allround daredevil
Tactical Enforcement Group
[ ∧ ]
|
06.10.2003 - 09:18:42 #0009
TEG Snoopy Fleet Admiral
         
 *Beagel vom Dienst* new |
Ich weiß ja nicht, ob ich das Problem richtig verstanden habe, aber der Rang ergibt sich doch daraus, wieviele vorhanden sind, die mehr Punkte haben. Ergo reicht doch ein einfacher Count() mit Where Punkte > eigene Punkte. ggf. noch um 1 erhöhen oder erniedrigen.
select count()
from blabla
where Punkte > :eigenePunkte
[ ∧ ]
|
06.10.2003 - 10:14:34 #0010
XCS CptnKiff Fleet Admiral
         
 new |
snoopy: das funzt tatsächlich! du bist ein genie!
[ ∧ ]
|
| >1< [ 2 ] |
| |