toppy Geschrieben 27. Juni 2007 Geschrieben 27. Juni 2007 Ich beziehe mich hiermit auf diesen Thread --> Link Kann ich denn die Werte/Ergebnisse einer SELECT-Abfrage mit Hilfe von PHP sortieren? Stelle mir das wie folgt vor: $result = mysql_query("SELECT A,B,C,D FROM ".$conf['db_prefix']."_db WHERE a > '0' AND status = '1'); $topA = $result GROUP BY A DESC LIMIT ".$anzahl; $topB = $result GROUP BY B DESC LIMIT ".$anzahl; usw. [/PHP] Ist dies möglich? Zitieren
johnhaltonx Geschrieben 27. Juni 2007 Geschrieben 27. Juni 2007 wieso willst du in PHP Sortieren? Wieso nicht gleich sortiert abfragen? $result = mysql_query("SELECT A,B,C,D FROM ".$conf['db_prefix']."_db WHERE a > '0' AND status = '1' order by a desc, b desc,c asc limit $anzahl"); du willst aber die Top X pro feld haben? dann würde ich pro Feld eine Abfrage machen. Aber ich glaube ich hab deine Anforderung nicht so ganz nachvollziehen können Zitieren
toppy Geschrieben 27. Juni 2007 Autor Geschrieben 27. Juni 2007 Aber ich glaube ich hab deine Anforderung nicht so ganz nachvollziehen können Nochmal ein paar Punkte zu, Hintergrund: es geht um ein Browsergamees sollen einzelne Toplisten von den besten Spielern mit z.B. Stärke, Technik, Tore, Vorlagen etc. erstellt werdenin der SELECT-Abfrage muss ich nun immer Namen, Position, Alter, Spiele vom Spieler selektieren und dann noch den richtigen Bezug zur Liga herstellen Möchte jetzt halt eine größere SELECT-Abfrage erstelllen, wo ich alle benötigten Werte selektiere, diese dann jeweils sortiere und anschleißend ausgebe. Wenn ich halt die "normale" Variante mit dem GROUP BY nehme, dann müsste ich z.B. 8 Mal erst alles auf's neue selektieren ( SELECT name, position, alter, nation etc.), um nur am Ende sortieren zu können. Zitieren
geloescht_JesterDay Geschrieben 27. Juni 2007 Geschrieben 27. Juni 2007 Stelle mir das wie folgt vor: $result = mysql_query("SELECT A,B,C,D FROM ".$conf['db_prefix']."_db WHERE a > '0' AND status = '1'); $topA = $result GROUP BY A DESC LIMIT ".$anzahl; $topB = $result GROUP BY B DESC LIMIT ".$anzahl; usw. [/PHP] Ist dies möglich? Nein. Lange Antwort: Als Ergebnis bekommst du nur eine Ressource mitgeteilt. Darin befinden sich die Ergebnisse der Abfrage, aber die hat selbst keinerlei Funktionalität. Wenn du das erreichen willst, dann schreibst du dir am besten eine eigene Klasse, die du befüllst mit mysql_fetch_array z.B. und die dann die Möglichkeit des sortierens hat. Wie? Z.B. mit einem Objekt für jede Zeile, und das Resultobjekt ist das Parentobjekt. Aber wie ganz genau kann ich dir nicht sagen... hatte dieses Problem noch nie Bastel dir halt verschiedene SQL-Abfragen oder mach es als AJAX. Ach ja, fällt mir grad ein: Falls du die Ergebnisse nicht alle zusammen auf einer Seite ausgeben willst, ist das eh unsinnig. Du musst die Seite für jede neue Sortierung eh neu Aufrufen, PHP läuft nur einmal, auf dem Server. Zitieren
toppy Geschrieben 27. Juni 2007 Autor Geschrieben 27. Juni 2007 Falls du die Ergebnisse nicht alle zusammen auf einer Seite ausgeben willst... Doch, werden ca. 6 oder 8 Tabellen - halt die Topstars der Liga Na mal schauen wie performant das am Ende noch ist, wenn ich diese 8 größeren SELECTs über mehrere 1000 Datensätze jage Na vielleicht wird's ja mit Hilfe von Indexen und/oder Cachen annehmbar... Aber Danke für die Antwort. Weiß ich zumindest wodran ich bin und kann mit der Arbeit beginnen. Zitieren
geloescht_JesterDay Geschrieben 28. Juni 2007 Geschrieben 28. Juni 2007 ...wenn ich diese 8 größeren SELECTs über mehrere 1000 Datensätze jage ... Mehrere 1000 Datensätze, wie niedlich Das sollte absolut kein Problem sein, wenn der Server nicht anderweitig total ausgelastet ist. Ein entsprechender Index (oder eben 8) beschleunigt die Sache nochmal extrem. Ich hab hier gerade ein php-Projekt zur Auswertung von Backup-Daten, da haben meine Testdaten für die File-Details jetzt schon > 1.100.000 Sätze Und die Abfrage (mit nem Index versteht sich) ist trotz mehrerer joins sehr erträglich. (Und das auf nem VM-Ware Server, also nen "echter" ist da noch bissl besser ) Zitieren
toppy Geschrieben 28. Juni 2007 Autor Geschrieben 28. Juni 2007 Muss das Thema leider doch nochmal aufgreifen: Zur Zeit speichere ich in der Datenbank lediglich die einzelnen Werte der Spieler (Stärke, Technik, Kondition, Frische, Zufriedenheit). Bei der Teamübersicht berechne ich daraus den Mittelwert: $ds = ($row['w_staerke']+$row['w_technik']+$row['w_kondition']+$row['w_frische']+$row['w_zufriedenheit']) / 5; Wie kriege ich denn jetzt aber eine Topliste zu den stärksten Spielern ohne die Durchschnittsstärke in der DB zu speichern? Geht das überhaupt? Müsste ja erst die einzelnen Werte selektieren, diese addieren+dividieren und anschließend sortieren. P.S. Das andere hab ich jetzt mit einzelnen Abfragen+Ausgabe gelöst. Funktioniert besser/schneller als gedacht Zitieren
Amstelchen Geschrieben 28. Juni 2007 Geschrieben 28. Juni 2007 Wie kriege ich denn jetzt aber eine Topliste zu den stärksten Spielern ohne die Durchschnittsstärke in der DB zu speichern? ich vermute, indem du diese zeile $ds = ($row['w_staerke']+$row['w_technik']+$row['w_kondition']+$row['w_frische']+$row['w_zufriedenheit']) / 5; direkt in der der DB rechnest, also auf MySQL-syntax umbaust. die berechnete durchschnittswerte in $ds kannst du dann ja wieder für eine sortierung heranziehen. s'Amstel Zitieren
toppy Geschrieben 28. Juni 2007 Autor Geschrieben 28. Juni 2007 direkt in der der DB rechnest, also auf MySQL-syntax umbaust. Uff, hab mal eben schnell nach MySQL rechnen gegoogelt - dafür hab ich heut aber keinen Nerv mehr :upps Wenn jemand ein Beispiel für mich hat bzw. erstellen kann, wie ich 5 Werte in MySQL addiere, diese durch 5 devidiere und anschließend sortiere, so wäre ich ihm sehr verbunden Zitieren
Amstelchen Geschrieben 28. Juni 2007 Geschrieben 28. Juni 2007 unter der annahme, dass deine columns auch so heissen, wie in der query angegeben: select (w_staerke + w_technik + w_kondition + w_frische + w_zufriedenheit) / 5 as ds; dein resultset enthält in diesem fall damit nur ds, und zwar schon fertig berechnet. eigentlich müsstest du das jetzt in derselben query mit einem ORDER BY verwenden, um die durchschnittseigenschaften "ranken" zu können. im übrigen sehe ich es als oftmals - aber nicht immer - sehr sinnvoll, soetwas durch die DB machen zu lassen. s'Amstel Zitieren
toppy Geschrieben 29. Juni 2007 Autor Geschrieben 29. Juni 2007 Super, klappt wunderbar - Vielen Dank Ein Schönheitsfehler ist noch: Er berechnet mir die Stärke bis auf 4 Stellen nach dem Komma - also z.B. 92.6000. Lässt sich das bei der Ausgabe auf 92 beschränken (in der SELECT-Abfrage, PHP oder HTML)? Zitieren
toppy Geschrieben 29. Juni 2007 Autor Geschrieben 29. Juni 2007 Hab's gefunden: while ($row = mysql_fetch_array($r_star)) { $ds = number_format($row['ds'], 2, ',', ''); [...] } [/PHP] Keine Ahnung, ob es die beste Lösung bzw. performant ist, aber es erfüllt erstmal seinen Zweck. Nochmals Danke für eure Hilfe Zitieren
kills Geschrieben 3. Juli 2007 Geschrieben 3. Juli 2007 MySQL AB :: MySQL 3.23, 4.0, 4.1 Reference Manual :: 12.4 String Functions Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.