Große Datenbank (MySQL) (Rangliste) sortieren per Cronjob

Hi Marius

Vielleicht solltest Du wenigstens versuchen, Hilfe anzunehmen.
Mit deiner Aussage:
Marius Heil hat gesagt.:
...
Das was vop da gerade zusammengefasst hat, stimmt nicht grad, bin ich der Meinung.
Wenn ich diese Anfrage hier: ...
Ausführe, liest mir die MySQL Datenbank alle Datensätze von 10 bis 20 aus....ich bekomme also dadurch 10 zufällige Datensätze....
widersprichst Du Dir selbst.
Hast Du es eigentlich einmal probiert?
Du bekommst mit Sicherheit nicht die Einträge 10 bis 20, denn das wären ihrer 11!

Außerdem findet die Sortierung definitiv vor der Übertragung und vor dem LIMIT statt.

Du darfst natürlich auch gerne deine eigene Sortierung programmieren, aber Du könntest es auch einfacher haben.
Gruß vop
 
Hi,

ich hatte es schonmal probiert, konnte nicht eher antworten, da tutorials.de abgestürzt war.
Ich denke, ich programmier mir jetzt einfach mal ne sortierung und poste die dann hier, hab schon was im Kopf, dann könnt ihr mir hinterher sagen, was ich anders machen könnte ;)
Ich weiß nämlich nicht genau, worauf ihr herauswollt. Aber vielen Dank nochmal für die Antworten, ich hoffe, ich komm in den nächsten paar Tagen zum programmieren, da ich mich in der Schue nicht mehr vor Arbeiten retten kann.



Marius
---
Mhhhh, tut mir wirklich Leid, dass ich euch so viel Zeit genommen hab, aber ganz offenbar scheint eure Lösung doch zu funktionieren :-(
Aber ich denke, wenn ich dann zb nach nem Benutzername suche und dazu noch alle Ränge ausgeben will, die 7 drüber und 7 drutner leigen, bekomm ich doch ein problem, nicht?
 
Zuletzt bearbeitet:
So,

ich hab inzwischen ziemlich viel weiterprogrammiert, was aber die ganze Zeit auf der Strecke gebleiben ist, ist die Ranglistensortierung :D
Naja, ich glaube, es stimmt doch, wenn man das ganze mit ORDER BY macht, nun aber die Frage, was mache ich, wenn ich haben will:
Einen bestimmten Usernamen und die 7 Ränge drunter und die 7 darüber?
Frage 2:
Was mache ich, wenn ich haben will:
Ich suche nun mit LIKE und zwar zb nach dem Suchbegriff "sdf", nun bekomme ich sagen wir mal 5 Ergebnisse, wie schaff ichs nun, dass ich mit der Abfrage auch noch die Ränge der User dazubekomm?


Marius
 
Der Rang entspricht bei der richtigen Sortierung der Zeilennummer.

Für Deine 7 vorher und nacher brauchst Du ein Subquery oder einen entsprechenden Workaround.

Gruß hpvw
 
Also ich merke schon, dass du, Marius, nicht allzu viel Erfahrung in SQL hast. Das ist auch nicht weiter schlimm. Ich bau dir mal ein kleines Beispiel ;) Ich denke das lässt sich Anschauung gut verwenden, melde mich später nochmal!

Im vorraus sei schonmal gesagt: Die SQL Anweisung "SELECT * FROM user ORDER BY punkte" liefert dir die komplette Rangliste!


Gruß Radhad


[EDIT]

Die erste Demo gibt es auf http://www.radhad.de

Infos zur table:
Datensätze: 1000
SQL-String: wird angezeigt
UserID: Primary Key, auto_increment
Userame: erstellt mit Zufallsgenerator
Punkte: erstellt mit Zufallsgenerator
Ladezeit: Wird mit microtime() ermittelt und am Ende ausgegeben

Wenn jemand schon eine Idee hat, wie man die 7 vor & nach dem User (UserID) bekommt, der möge dies hier posten, können wir ja dann testen.

Mein Tipp wäre, pro Seite 50 oder 100 Ränge anzeigen zu lassen und dann den User (UserID) fett hervorzuheben, und dem User direkt diese Seite präsentieren.

Sind mehr Datensätze erwünscht, kann ich Problemlos noch mehr hinzufügen!
 
Zuletzt bearbeitet:
Solange das ganze mit PHP programmiert wird sollte es keine große Hürde darstellen.

Man will einen User und die darumliegenden Plätze wissen.

Man baut sich eine Abfrage, welche den entsprechenden User ausgibt und seinen exakten Platz oder seine exakte Punktzahl.

Nun nimmt man diese Punktzahl und baut darauf aufbauend zwei Abfragen.
Eine in der die Punktzahl größer als die gegebene sein muß und wählt nur die ersten 7.
Eine in der die Punktzahl kleiner als die gegebene sein muß und wählt nur die ersten 7.

Schon hat man den betreffenden User und 7 darumliegende Plätze.

Die Ausgabe dafür zu bauen ist dem Geschmack freigestellt.


Alternativ könnte man auch die komplett sortierte Rangliste in ein Array drücken und dieses per Index ansteuern. Sobald man den Index hat, welcher dem gewünschten User entspricht ist es ein Klax von diesem Index die 7 vorhergehenden und die 7 nachfolgenden zu wählen. Das würde ich jedoch nur empfehlen, wenn die Datenmengen sich in Grenzen halten.
 
Mhhhh, ja, du ahst recht, so geht das, aber ich glaube fast, dass eine einzelne Anfrage Ressoursenschonender wäre.
Verzeit mir, dass ich so spät antworte, ich dreh zurzeit nen Film und jetzt ist grad der Endspurt, das ganze Material zusammenschneiden, mit effekten versehen, usw.....
Nicht mehr allzuviel Zeit.


Marius
 
Um ehrlich zu sein kann ich deine Angst vor mehreren SQL-Abfragen nicht verstehen. Die Performance einer SQL-Abfrage ist um längen besser als wenn du mit wirklich großen Arrays in PHP rumwurschtelst.

Die Laufzeiten in einem kleinen Projekt werden sich nichts nehmen, wenn du mit deinem Projekt jedoch einst wirklich richtig große Zahlen hast, dann wird es sehr schnell sinnvoller zu sein mehr Abfragen per mySQL zu machen als mit großen Arrays in PHP zu arbeiten. Nicht nur dein RAM wird es dir danken.

Du solltest nicht vergessen, daß mySQL hochgradig optimiert ist. Das trifft selbstverständlich auch auf andere Datenbanksysteme zu, wobei da jeder so seine eigenen kleinen Besonderheiten aufweist, die der Ottonormalprogrammierer in den seltensten Fällen ankratzt.

Oftmals wirst du feststellen, daß die Performance nicht unter der Anzahl an Abfragen leidet sondern wie gut deine Abfrage auf den zu leistenden Sachverhalt optimiert ist. Genauso wirst du eher Performancelecks in deiner PHP-Algorithmik haben als sonstwo, denn nichts ist kniffliger als wirklich gut optimierten Code zu schreiben, denn hier muß man überhaupt erstmal wissen auf welche Werte man optimieren will. Speichernutzung, Geschwindigkeit und so weiter und so fort, denn sie korrelieren nur selten direkt miteinander, sondern beeinflussen sich meist antiproportional.

Wenn ich deine Posts lese und ich hoffe du nimmst mir das jetzt nicht sofort übel, habe ich den Eindruck als ob du dir große Projekte aufhalst, sie perfekt machen willst und dir vor der Fertigstellung dann ein anderes Projekt in die Quere kommt. Sollte das zutreffen, dann müßtest du deinen Perfektionismus kanalisieren und nur auf Teilaspekte loslassen, aber nicht auf das Ganze. Aber natürlich kann da meine Hobbypsychologie auch total fehl gehen ^^
 
Hi,

das Projekt ist reichlich groß, soweit so gut, mit den mehreren Projekten gleichzeitig leigst du auch nciht falsch, ich bekomm jedoch alle fertig, nur dass in den letzten paar Tagen des Filmens das andere mal etwas warten muss, naja, solange hat der Zeichner Zeit ^^
Das Problem ist bei mir einfach, dass ich alles mach^^
Programmieren, Filmschneiden, 3D, demnächst mag ich ein eigenes Lied komponieren (Naja, tu ich zurzeit schon, aber Instrumental) das nächste wird mit Gesang, usw,...
Wenn der FIlm fertig ist, werd ichs höchstwahrscheinlich mit deinem Vorschlag ausprobieren, scheint doch ganz passabel ^^
Es ist nciht so, dass ich mit großen Arrays rumwerkel, die größten arrays haben 40 Zeichen insgesamt oder so^^ Dachte nur, wenn man die MySQL Anfrage entsprechend formuliert, bekommt man das Ergebniss mit einer Abfrage.


Marius
 
Zurück