php und mysql problem



  • ich will folgendes mittels php und mysql anstellen, komme aber nicht weiter...

    ich mache ne kleine automatisierung für bowling ergebnisse, wo ich folgende tabellen haben:

    spiel (für jede einzelnen bowlrunde)
    ergebnis (bekomtm den spieler und das spiel)
    spieler

    ich lege dann, wenn wir bowlen waren einfach z.b. 4 neue spieler an,wenn wir 4 stück gemacht haben und trage für jedes spiel für einen spieler seine punkte,strikes und spares ein....

    daraus lasse ich bisher halt mittels einer mysql abfrage eine gesamtübersicht stellen,in der ich ne tabelle habe wo alle spieler drin sind, mit ihren gesamtpunkten, schnittpunkte usw... das war soweit ja alles noch recht simpel... nur jetzt kommt es:

    ferner will ich das er automatisch den sieger einer runde (höchste punkte) ermittelt, seine siege aufsummiert und mit in die eine tabelle schreibt...

    das halt spieler a neben seinen gesmatpunkten und schnitt auch z.b. 6 siege zu verzeichnen hat...

    und,was denke ich noch schwerer ist, wie in der formel 1 möchste ich auch punkte vergebn pro spiel.. der erste bekommt 4, der zweite 2, der dritte 1, und auch dieses soll pro spieler aufsummiert und mit ausgegeben werden...

    die berechnung, die wohl mit einer zweiten bzw. dritten mysql stattfindet, ist die eine sache, und weiss ich auch nicht wie ich das aufsummiere und in einer variable (??) speichere...

    und die andere sache ist, das es aber möglichst mit in die zeile jeweils soll, wo ich schon die andere berechnung mache...

    Naja, hoffe mal das überhaupt jemand versteht was ich meine, und mir dann auch nioch vllt. helfen kann 🙂



  • so genau hab ich jetzt nicht verstanden was du willst.
    aufsummieren kannst du mit sum(spalte). den durchschnitt
    kannst du ueber avg(spalte).

    "mal" doch mal die tabellenstruktur auf.

    und zeig evtl. mal ein paar beispiel datensaetze.



  • ich vereinfache mal das ganze ein bisschen, und zeige was ich explizit brauche, denke das ist einfacher mir so zu helfen, als wenn ich alle tabellen hier zeige,was dann aber ja noch nichts mit meinem Problem zu tun hat:

    $query2 = "SELECT  spitzname, punkte
    FROM `ERGEBNIS` , `SPIELER`
    WHERE SPIELER.spieler_id = ERGEBNIS.spieler_id
    AND ERGEBNIS.spiel_id='$spiel_id'
    ORDER BY punkte DESC ";
    
    $result2=mysql_query($query2);
    while ($daten2=mysql_fetch_array($result2, MYSQL_ASSOC))
    {
    	echo $daten2[spitzname];
    	echo $daten2[punkte];
    	echo "<br>";
    	$feldSieg[$daten2[spitzname]] = $daten2[punkte];
    }
    

    So, das ist mein problem... diese abfrage liefert mit zu einem bestimmten spiel die teilgenommenen spielernamen und dessen punkte, also kommt hier als ergebnis z.b. sowas raus:

    tom 174
    ray 122
    paul 100
    peter 92

    das mache ich aber für viele spiele hintereinander (in FOR SCHLEIFE HALT) so das s ich am ende ein feld brauche, das als index die spielernamen hat, und als wert jeodch meine punkte die ich brauche, also einmal ein feld wo die siege aufsummiert werden, und einmal ein feld wo ich die punkte verteile, der erste bekommt 4, der zweite 2 und soweiter...

    sprich,nochmal, beispiele, aus 2 spielen die mir mit der obigen abfrage folgende ergebnisse liefert:

    tom 174
    ray 122
    paul 100
    peter 92

    und

    ray 200
    paul 150
    peter 120
    tom 100

    brauche ich folgendes ergebnis:

    für die gesamtsiege:

    feld[tom] => wert =1 feld[ray] => wert =1
    feld[paul] => wert =0 feld[peter] => wert =0

    für die punkte

    feld2[tom] => wert =4 feld2[ray] => wert =4
    feld2[paul] => wert =1 feld2[peter] => wert =1

    hoffe es ist jetzt etwas klarer... ich weiß jedenfalls nicht wie ich das hinbekommen soll das der das feld so am ende hat.



  • habs jetzt doch selber hinbekommen, nur weiss ich nicht ob ich es zu umständlich mache, oder das genau der Weg ist. Lasse den anderen Beitrag noch drin, um besser zu verstehen was ich da vorhabe... hoffentlich guckt sich das jemand an, will wirklich wissen ob das so ok ist...

    // Höchste Spiel ID aus der DB holen, um auf Variable zu schreiben
    			$query3 = "SELECT max(spiel_id) AS maxID from SPIEL";
    			$result3=mysql_query($query3);
    			while ($daten3=mysql_fetch_array($result3, MYSQL_ASSOC))
    			{
    				$spielID=$daten3[maxID];
    			}
    
    // FOR Schleife mit so vielen durchläufen, wie Spiele in der DB
    for ($k="1"; $k<=$spielID; $k++)	{				
    
    				// SQL Abfrage für das jeweilig betrachtete Spiel, Ergebnis wird nach Punkte sortiert
    				$query2 = "SELECT  spitzname, punkte
    				FROM `ERGEBNIS` , `SPIELER`
    				WHERE SPIELER.spieler_id = ERGEBNIS.spieler_id
    				AND ERGEBNIS.spiel_id='$k'
    				ORDER BY punkte DESC ";
    
    				$result2=mysql_query($query2);
    				$help = 0;
    
    				// Die Namen werden in ein Hilfs-Array geschrieben, so dass von Index 0-X
    				// die Reihenfolge des Spielergebnisses ist... an erster Stelle steht der mit den 
    				// meisten Punkten, dann der zweitbeste etc...
    				while ($daten2=mysql_fetch_array($result2, MYSQL_ASSOC))
    				{
    					$flag=true;	
    					$feldHelp[$help] = $daten2[spitzname];
    					$help++;
    
    				}	
    							// Mit Hilfe des Hilfs-Array und dessen jeweilige Reihenfolge des Spielergebnisses 
    							// (die Namen) können nur in den jeweiligen ZielFelder die nötigen Werte addiert
    							// werden, als Index wird der Spielername übergeben (aus dem HilfsArray).
    							if($flag) {
    								for ($y="0"; $y<="2"; $y++)
    								{
    								    if ($y=="0") {
    									    $feldGewonnen[$feldHelp[$y]]+=1;
    									    $feldWCpunkte[$feldHelp[$y]]+=4;
    								    }
    								    elseif ($y=="1") 
    								    	$feldWCpunkte[$feldHelp[$y]]+=2;  
    								    else
    								    	$feldWCpunkte[$feldHelp[$y]]+=1;
    								}
    							}
    
    				$flag=false;
    
    }
    

    wenn das jemand versteht, schonmal hut ab... naja, es geht ja auch erstmal was ich will, das is ja das wichtigste, nur 2 Fragen / Probleme habe ich noch:

    um einen wert sich aus ner db-tabelle zu holen, und den auf ne variable zu schreiben, ist das so der kürzeste weg ?

    $query3 = "SELECT max(spiel_id) AS maxID from SPIEL";
    			$result3=mysql_query($query3);
    			while ($daten3=mysql_fetch_array($result3, MYSQL_ASSOC))
    			{
    				$spielID=$daten3[maxID];
    			}
    

    und, ich arbeite ja jetzt so das ich meine abfrage nach erzielten punkte sortieren lasse, um somit die reihenfolge der spielernamen zu bekommen, als erster steht als erstes in dem feld usw...

    problem gibt es jetzt ja, wenn 2 leute gleich viele punkte erzielen, denn da nimmt ja die db sonst einfach den der zuerst steht, und bei meinem lösungsansatz wäre der eine halt zweiter,der ander dritter z.b. trotz gleicher punkte...

    deswegen will ich eigentlich, wenn 2 leute gleiche punkte haben, das der an höherer stelle stehen soll, der mehr strikes , oder wnen das auch gleich ist, mehr spares hat, und dann meinetwegen losen.

    wie bekomme ich das in die abfrage rein, das das berücksichtigt wird ? sollte also sowas werden:

    $query2 = "SELECT  spitzname, punkte,spares,strikes
    				FROM `ERGEBNIS` , `SPIELER`
    				WHERE SPIELER.spieler_id = ERGEBNIS.spieler_id
    				AND ERGEBNIS.spiel_id='$k'
    				ORDER BY punkte DESC ";
                                     // und falls 2 leute gleiche punkte haben, soll noch nach strikes und spares geguckt werden, und dann die reihenfolge festgelegt werden...
    


  • $query3 = "SELECT max(spiel_id) AS maxID from SPIEL";
    $result3=mysql_query($query3);
    while ($daten3=mysql_fetch_array($result3, MYSQL_ASSOC))
    {
       $spielID=$daten3[maxID];
    }
    

    Die ist schonmal daneben. Leider shee ich sowas immer wieder. Sogar bei Profis. DIese wollen die Anzhal Datensätze einer Tabelle haben und machen einefach einen SELECT auf alle Daten. Das Ergebnis gehen sie dann in einer Schleife durch und inkrementieren eine Zählervar. HORROR. Du machst es ähnlich.
    Wenn spiel_id ein INT-Feld ist (und davon gehe ich auch bei deiner Schleifenlösung aus sonst würde die auch nicht gehen) dann überläßt man es MySQL die hochste Zahl zu liefern.
    SELECT spiel_id AS maxID from Spiel ORDER BY spiel_ID ASC LIMIT 1



  • weiß nicht genau was du meinst ? Ich gehe doch auch nicht alle datensätze durch sondern lasse nur das höchste feld ausgeben !?

    Bei dir muss ich dich auch den weg über die whileschleife dann gehen,würde ja nur den query ersetzen,und der sieht ja nicht so viel anders aus... im gegenteil, du gibts eigentlich alle aus, limitierst aber auf einen, und ich gebe direkte nur den höchsten aus, mit der max-funktion halt.



  • Ich meinte in deinem Fall die whileschleife. Auch wenn du nur eine Datensatz zurück bekommst. So eine Programmierung verleitet zu angeführten Code wo man einen Datensatz willund eine Whileschleife durchläuft um auf diesen zu kommen.
    Mach ein IF mit Fehlerabfrage.
    Was machst du wenn der Query Fehlschlägt?



  • deejay ray schrieb:

    wenn 2 leute gleiche punkte haben, das der an höherer stelle stehen soll, der mehr strikes , oder wnen das auch gleich ist, mehr spares hat, und dann meinetwegen losen.

    wie bekomme ich das in die abfrage rein, das das berücksichtigt wird ? sollte also sowas werden:

    $query2 = "SELECT  spitzname, punkte,spares,strikes
    				FROM `ERGEBNIS` , `SPIELER`
    				WHERE SPIELER.spieler_id = ERGEBNIS.spieler_id
    				AND ERGEBNIS.spiel_id='$k'
    				ORDER BY punkte DESC ";
                                     // und falls 2 leute gleiche punkte haben, soll noch nach strikes und spares geguckt werden, und dann die reihenfolge festgelegt werden...
    

    du kannst in der order by klausel beliebig viele spallten angeben:
    ORDER BY punkte desc,spares desc, strikes desc

    zu deinem problem zum automatischen bestimmen des siegers:
    hmm. ich denke mal sowas mit purem sql zu loesen ist super
    schwer. warum speicherst du nicht gleich die punkte verteilung
    (also die 4,3,...) mit ab (oder zumindest eine siegesgewichtung
    aus der sich die punkte bestimmen lassen)?

    $query3 = "SELECT max(spiel_id) AS maxID from SPIEL";
    $result3=mysql_query($query3);
    while ($daten3=mysql_fetch_array($result3, MYSQL_ASSOC))
    {
       $spielID=$daten3[maxID];
    }
    

    wozu das while? da kommt nur ein datensatz zurueck bzw.
    eine fehlermeldung, wenn was schiefgeht.



  • da sproblem mit der siegerbestimmung und punkteverteilung habe ich doch schon gelöst und oben gepostet !?

    Was habt ihr immer wegen dem while für das eien ergebnis ? Wie muss denn da der komplette code aussehen,umd as ergebnis in eine variable zu bekommen ?

    Wenn was schief geht ? Keine ahnung, hab nirgends fehlerabfangungen drin bzw. weiss ich auch nicht wie die aussehen müssen.



  • Dann solltest du dich in deiner PHP-Docu erkundigen und nachlesen.

    Ich habe was gegen while weil da kein Fehler ermittelt werden kann.
    Auch mysql_fetch_array kann einen Fehler zurückgeben.
    Aber natürlich kannst du es machen wie Du willst und keine Tips annehmen nach denen Du gefragt hast.



  • da hab ich jetzt nix von verstanden,also nochmal:

    wie muss dann der code aussehen um das inne variable zu speichern und wie mus sich fehler abfangen, verwende ja oft while schleifen.


Anmelden zum Antworten