Hallo,
ich habe ein Problem bezüglich einer MySQL-Abfrage, die ich nicht hinkriege. Ich hoffe jemand kann mir helfen. Ich komme leider auch nicht zu einem Ansatz in die richtige Richtung.
Ich beziehe mich auf zwei Tabellen:
users:
id | name
battles:
userid1 | userid2 | winner
Es geht darum, dass die Mitglieder des Forums in kleinen 1-gegen-1-Contests gegeneinander antreten, wobei einer von beiden immer als Gewinner speichert wird.
Die Felder userid1, userid2 und winner speichern jeweils die UserIDs der beiden teilnehmenden User ab, folglich ist "winner" immer gleich "userid1" oder "userid2".
So, nun habe ich versucht eine Abfrage zu konstruieren, in der die User ihrer Gewinnquote nach sortiert werden, d.h. nach dem Quotient aus "Anzahl der gewonnen battles" durch "Anzahl der insgesamt gespielten battles".
der erste Teil war noch recht leicht:<br />SELECT<br /> battles.winner as userid,<br /> users.name as username,<br /> COUNT(*) as count_wins<br />FROM<br /> battles,<br /> users<br />WHERE<br /> battles.winner=users.id<br />GROUP BY<br /> battles.winner<br />ORDER BY<br /> count_wins DESC;<br />
Mit dieser Abfrage werden also die User (mit ID und Name) nach ihrer absoluten Gewinnanzahl sortiert und ausgegeben, aber leider berücksichtigt sie nicht die Anzahl der teilgenommenen Spiele.
Die Ausgabe sieht etwa so aus:<br />[0] => Array<br /> (<br /> [userid] => 10<br /> [username] => user10<br /> [count_wins] => 4<br /> )<br /><br />[1] => Array<br /> (<br /> [userid] => 13<br /> [username] => user13<br /> [count_wins] => 3<br /> )<br /><br />[2] => Array<br /> (<br /> [userid] => 12<br /> [username] => user12<br /> [count_wins] => 3<br /> )<br /><br />[3] => Array<br /> (<br /> [userid] => 11<br /> [username] => user11<br /> [count_wins] => 2<br /> )
Wenn ich ein zweites Count einbaue, erhält dies leider den gleichen Wert wie das schon eingebaute COUNT(). Das GROUP BY scheint da das ganze zu beschränken, aber wenn ichs wegnehme werde die ´winners´ nicht mehr gezählt.
Ich suche also etwas, das so in der Art anfängt:<br />SELECT<br /> battles.winner as userid,<br /> users.name as username,<br /> COUNT(xxx) as count_wins,<br /> COUNT(yyy) as count_games,<br /> count_wins/count_games as winning_rate<br />FROM<br /> battles,<br /> users<br />.............................<br />
Kann mir bitte jemand mit meinem Problem weiterhelfen?
Ich hab schon was mit UNION versucht, um zwei SELECTs zu verknüpfen, aber das hat auch nicht funktioniert, ich bastel schon seit vielen Stunden rum, aber mir fällt nichts mehr ein.
Wär echt sehr nett, wenn jemand ne Idee hat, um mir weiterzuhelfen
Schonmal vielen Dank im Voraus =)
<?php<br />// SQL connect usw usw<br /><br />$select = mysql_query("SELECT * FROM users ORDER BY name ASC") or die("ERROR"));<br />while($data = mysql_fetch_object($select)) {<br /> $num1 = mysql_num_rows(mysql_query("SELECT * FROM battles WHERE userid1 = ".$data->id." OR WHERE userid2 = ".$data->id."")); // MATCHES die er jemals gespielt hat<br /> $num2 = mysql_num_rows(mysql_query("SELECT * FROM battles WHERE winner = ".$data->id."")); // MATCHES DIE GEWONNEN WURDEN<br /> $quotient = $num2 / $num1;<br /> echo "<p>Gewonnen: $num2<br>Gesammt gespielt: $num1<br>Quotient: $quotient</p>";<br /> unset($num1, $num2, $quotient);<br />}<br />?>
ich hoffe das kann dir weiterhelfen, ich lasse das ganze nicht per array zurückgeben, dass musst du dann ändern, aber als grundansatz sollte es gehen oder?
ich hoffe ich habe nix falsch gemacht :baby:
hey schonmal vielen dank für die antwort!!!
leider ist es so, dass bei meinem forum die userdatenbank so dermaßen voll ist, dass es echt lang dauern würde, wenn man so viele querys ausführt.
glaubst du es geht auch in einer abfrage?
ich frage mich ob es überhaupt geht, aber ich hab in dem bereich nur grundkenntnisse, vielleicht lässt sich das auch so lösen?
vielleicht fällt jemandem ja nochwas ein, aber schonmal danke, dass du dir gedanken gemacht hast!!
ja, ich würde es auch echt gerne so benutzen, jedoch enthält die zugehörige userdatenbank über 3000 user, und es werden ständig mehr.
die rechenzeit ist durch die while-schleife einfach zu hoch, dann müsste ich noch das riesen-array sortieren nach dem quotienten... deswegen suche ich eine abfrage, die das in einem hinkriegt.
aber ich probiers mal aus, vielleicht kann das doch schneller verarbeitet werden, als ich mir das gedacht habe...
baue doch einfach ein blätter script ein und lasse das ganze nach wunsch des users sortieren, dann geht das schnell und der user kann sich die infos suchen die er will, da du ja jedem "battle" ne ID gibst, kannst du auch die ID´s nennen und somit kann sich ein user nur die ID weiter geben und dann kann man details dazu suchen.
Original von Eisberg
baue doch einfach ein blätter script ein und lasse das ganze nach wunsch des users sortieren, dann geht das schnell und der user kann sich die infos suchen die er will, da du ja jedem "battle" ne ID gibst, kannst du auch die ID´s nennen und somit kann sich ein user nur die ID weiter geben und dann kann man details dazu suchen.
ich glaube irgendwie , dass sql garkeine division kann für ergebnisse, bzw kenn ich den befehl net.....für ne addition gibts ja SUM() für den durchschnitt AVG(), meien idee : vlt 2 sql tables und dann mit AVG() arbeiten, nur ne spontane idee, ka obs geht ist auchnur nen ansatz
It looks like you're new here. If you want to get involved, click one of these buttons!