Hallo erstmal!
ich versuche gerade bestimmte Daten so auszulesen, dass ich weder unzählige Queries brauche, noch alles mögliche aus der DB hole und erst in PHP filtere. Allerdings stehe ich gerade ziemlich auf dem Schlauch.
Es geht um ein Fussball-Tippspiel.
Die relevaten Tabellen:
1. "users": Hier sind die Felder 'id' und 'points' relevant. points stellt die Anzahl der Punkte dar, die der user insgesamt gewonnen hat bisher.
2. "matches": Hier ist die id relevant und der status, welcher für folgendes vorhaben auf "finished" stehen muss. Die Tabelle ansich repräsentiert die eínzelnen Spiele der Mannschaften.
3. "wetten": hier sind user-id und match-id relevant, wobei die user-id den ids aus 1. entspricht und match-id den ids aus 2. Zusätzlich gibt es noch ein Feld credits. Dieses beschreibt, wieviel punkte der user in diesem speziellen match bekommen hat. Im Gegensatz zu den points aus 1. sind diese Werte nicht numerisch, sondern Konstanten wie "win", "loss".
Was getan werden soll:
Von den besten 10 Usern (= den 10 mit den meisten Punkten) soll ermittelt werden, wie oft sie in den letzten 10 matches (= neusten 10 matches mit status = finished) die Konstanten win oder loss erhalten haben, genau gesagt für jeden einzelnen.
Da das Skriptergebnis gecacht wird, ist die Performance ziemlich zweitrangig, aber was mir bisher so einfiel ist trotz dessen unter aller sau.
Ich hätte es simpel gehalten und 3 Queries gebaut. Der erste holt die besten 10 User (Select id from users order by points desc limit 0,10), der zweite holt die letzten 10 matches (select id form matches where status = closed order by date desc limit 0,10)... tjo und da ich die Daten jetzt in PHP habe, wäre der dritte ja kein Problem mehr... dachte ich. Das wäre dann für jeden user alle matches durchgehen und die credits fetchen -> 2 verschachtelte foreach-Schleifen mit einem Query in der Mitte.. (select credits from wetten where userid = ? and matchid = ?). Rein logisch betrachtet sicherlich richtig, aber da wäre ich ja bei 100 Queries.
Wie würdet ihr das lösen?
Danke!
ich versuche gerade bestimmte Daten so auszulesen, dass ich weder unzählige Queries brauche, noch alles mögliche aus der DB hole und erst in PHP filtere. Allerdings stehe ich gerade ziemlich auf dem Schlauch.
Es geht um ein Fussball-Tippspiel.
Die relevaten Tabellen:
1. "users": Hier sind die Felder 'id' und 'points' relevant. points stellt die Anzahl der Punkte dar, die der user insgesamt gewonnen hat bisher.
2. "matches": Hier ist die id relevant und der status, welcher für folgendes vorhaben auf "finished" stehen muss. Die Tabelle ansich repräsentiert die eínzelnen Spiele der Mannschaften.
3. "wetten": hier sind user-id und match-id relevant, wobei die user-id den ids aus 1. entspricht und match-id den ids aus 2. Zusätzlich gibt es noch ein Feld credits. Dieses beschreibt, wieviel punkte der user in diesem speziellen match bekommen hat. Im Gegensatz zu den points aus 1. sind diese Werte nicht numerisch, sondern Konstanten wie "win", "loss".
Was getan werden soll:
Von den besten 10 Usern (= den 10 mit den meisten Punkten) soll ermittelt werden, wie oft sie in den letzten 10 matches (= neusten 10 matches mit status = finished) die Konstanten win oder loss erhalten haben, genau gesagt für jeden einzelnen.
Da das Skriptergebnis gecacht wird, ist die Performance ziemlich zweitrangig, aber was mir bisher so einfiel ist trotz dessen unter aller sau.
Ich hätte es simpel gehalten und 3 Queries gebaut. Der erste holt die besten 10 User (Select id from users order by points desc limit 0,10), der zweite holt die letzten 10 matches (select id form matches where status = closed order by date desc limit 0,10)... tjo und da ich die Daten jetzt in PHP habe, wäre der dritte ja kein Problem mehr... dachte ich. Das wäre dann für jeden user alle matches durchgehen und die credits fetchen -> 2 verschachtelte foreach-Schleifen mit einem Query in der Mitte.. (select credits from wetten where userid = ? and matchid = ?). Rein logisch betrachtet sicherlich richtig, aber da wäre ich ja bei 100 Queries.
Wie würdet ihr das lösen?
Danke!
Kommentar