Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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

Geschrieben
Aber ich glaube ich hab deine Anforderung nicht so ganz nachvollziehen können

Nochmal ein paar Punkte zu, Hintergrund:

  • es geht um ein Browsergame
  • es sollen einzelne Toplisten von den besten Spielern mit z.B. Stärke, Technik, Tore, Vorlagen etc. erstellt werden
  • in 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.

Geschrieben

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 :D

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.

Geschrieben
Falls du die Ergebnisse nicht alle zusammen auf einer Seite ausgeben willst...

Doch, werden ca. 6 oder 8 Tabellen - halt die Topstars der Liga :D

Na mal schauen wie performant das am Ende noch ist, wenn ich diese 8 größeren SELECTs über mehrere 1000 Datensätze jage :rolleyes:

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.

Geschrieben
...wenn ich diese 8 größeren SELECTs über mehrere 1000 Datensätze jage :rolleyes: ...

Mehrere 1000 Datensätze, wie niedlich :D

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 ;) )

Geschrieben

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

Geschrieben
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

Geschrieben
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 ;)

Geschrieben

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

Geschrieben

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)?

Geschrieben

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 :)

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...