PHP, MYSQL Sortieren
hattrix
- php
Hallo,
folgendes:
Select-Abfrage: SELECT ... ORDER BY user.punkte DESC ...
php-Datei:
Habe 3 Spalten (table)
1.Spalte:
Name
2.Spalte:
if (wert==x) echo $row['punkte'];
if (wert==x) echo $row['punkte']/2;
if (wert==x) echo $row['punkte']/4;
3.Spalte:
echo $row['punkte'];
Jetzt sortiert er nach Spalte 3, aber wie lasse ich nach Spalte 2 sortieren?
Gruß
Hattrix
hi,
Jetzt sortiert er nach Spalte 3, aber wie lasse ich nach Spalte 2 sortieren?
Drücke dich bitte klar aus - wonach willst du sortieren?
2.Spalte:
if (wert==x) echo $row['punkte'];
if (wert==x) echo $row['punkte']/2;
if (wert==x) echo $row['punkte']/4;
Wenn x jedes mal einen unterschiedlichen Wert haben soll, du also mal die vollen Punkte, mal auch nur die halben oder ein Viertel ausgeben willst, dann sag das bitte auch dazu.
gruß,
wahsaga
Es wird gerade nach dem Feld "user.punkte" sortiert, sprich Spalte 3 in der Tabelle in der PHP-Datei.
Die Spalte 2 hat if-Abfragen, wo x immer ein anderen Wert hat. Dadurch werden die "user.punkte" neu berechnet. Und danach soll sortiert werden.
Bsp: http://hattrix.tida-world.de/bwarteliste.php
hi,
Es wird gerade nach dem Feld "user.punkte" sortiert, sprich Spalte 3 in der Tabelle in der PHP-Datei.
Es wird bereits sortiert, bevor auch nur irgendwas in PHP ankommt oder ein einer HTML-Tabelle landet.
Die Spalte 2 hat if-Abfragen, wo x immer ein anderen Wert hat.
Geht's etwas genauer? Ist x zufallsabhängig, oder was ...?
Dadurch werden die "user.punkte" neu berechnet. Und danach soll sortiert werden.
Wenn der Datenbank die Berechnung noch nicht bekannt ist, kann sie schwerlich danach eine Sortierung vornehmen - das sollte einleuchtend sein.
Dann wäre die Sortierung ggf. erst Scriptseitig vorzunehmen - alle Werte von der DB zuerst in ein Array packen, Berechnungen durchführen, sortieren, ausgeben.
gruß,
wahsaga
x hat 3 Werte ... 1, 2 und 3 ...
Wie mache ich das mit dem array?
hi,
x hat 3 Werte ... 1, 2 und 3 ...
Und welchen davon wann?
Besteht irgendeine Abhängigkeit bzw. ein Zusammenhang mit den Daten aus der DB, so dass diese die Berechnung oder Unterscheidung bereits durchführen könnte.
Wie mache ich das mit dem array?
Ich lese im Manual nach, und informiere mich.
gruß,
wahsaga
Ja, kommt aus der DB. Sorry!
"wert" ist gleich $row['wert'] und "x" ist dann eben gleich der Wert, der dort drin steht. Also in $row['wert'] sind nur zahlen von 1 bis 3 vorhanden!
Hi,
"wert" ist gleich $row['wert'] und "x" ist dann eben gleich der Wert, der dort drin steht. Also in $row['wert'] sind nur zahlen von 1 bis 3 vorhanden!
Wenn ich dich richtig verstehe ist x das gleiche wie wert.
Das macht aber keinen Sinn, denn somit ist ja "if(wert==x)" immer true.
meinst du "if(wert==1) ... if(wert==2) ... if(wert==3)"?
mfG,
steckl
"wert" ist der Feldname der DB. Daher ist er immer gleich. Halt der Feldname "Wert". In diesem Feldname gibt es halt 3 verschiedene Zahlen, die ich abfrage. Je nachdem was drin steht, geht die if-abfrage rein!
Hallo hattrix,
"wert" ist gleich $row['wert'] und "x" ist dann eben gleich der Wert, der dort drin steht. Also in $row['wert'] sind nur zahlen von 1 bis 3 vorhanden!
Mit
SELECT
...,
punkte / [link:http://dev.mysql.com/doc/refman/4.1/en/mathematical-functions.html#id2735718@title=POW](2, wert - 1) AS PunkteGewichtet
FROM ...
bzw.
punkte * POW(2, 1 - wert) AS PunkteGewichtet
kannst Du die Berechnung gleich vom DBMS vornehmen lassen. Zum Verständnis der Berechnungsformel sind Kenntnisse in der Potenzrechnung hilfreich.
Freundliche Grüße
Vinzenz
was ist aber, wenn "x" auch Buchstaben enthält?
hi,
was ist aber, wenn "x" auch Buchstaben enthält?
Dann erzählt uns hattrix hier einen Scheiss nach dem anderen, weil er uns gerade eben noch weismachte,
"wert" ist gleich $row['wert'] und "x" ist dann eben gleich der Wert, der dort drin steht. Also in $row['wert'] sind nur zahlen von 1 bis 3 vorhanden!
dass es sich nur um die Zahlen von 1 bis 3 handele.
gruß,
wahsaga
Sorry, ich dachte, so ist mein Problem vielleicht einfacher zu verstehen! :-(
hi,
Sorry, ich dachte, so ist mein Problem vielleicht einfacher zu verstehen! :-(
Sich beim Fragen auf das Wesentliche zu beschränken, ist natürlich erwünscht. Wesentliches wegzulassen, ist aber nicht zielführend.
Gut, jetzt kann statt 1, 2 oder 3 also auch ein Buchstabe vorkommen.
Wie soll die Darstellung denn dann überhaupt erfolgen?
Das ist aus dem bisher bekannten noch gar nicht abzuleiten, da sich auch deine drei IF nur auf Zahlen/Ziffern bezogen.
gruß,
wahsaga
Ok, dann erkläre ich es genauer und ausführlicher:
$strSQL = "SELECT * FROM hattrix_user INNER JOIN hattrix_vereine ON hattrix_user.id_v = hattrix_vereine.id_v WHERE hattrix_user.status = 'liga' AND hattrix_user.spiele > '0' ORDER BY hattrix_user.punkte DESC";
while($row = mysql_fetch_row($result)) {
?>
<table><tr><td>
<? // danach soll sortiert werden
if ($row[14] == '1.Bundesliga') { echo $row[6]; }
if ($row[14] == '2.Bundesliga') { echo $row[6]/2; }
if ($row[14] == 'Regionalliga Nord') { echo $row[6]/4; }
if ($row[14] == 'Regionalliga Süd') { echo $row[6]/4; }
?>
</td></tr><tr><td>
<?
echo $row[6]; // danach wird derzeit sortiert
?>
</td></tr></table>
}
?>
// $row[14] = Feldname (liga) varchar
// $row[6] = Feldname (punkte) integer
Hallo hattrix,
if ($row[14] == 'Regionalliga Nord') { echo $row[6]/4; }
if ($row[14] == 'Regionalliga Süd') { echo $row[6]/4; }
sagte ich es nicht schon: Die nächste Ligenreform kommt bestimmt. Plane sie bereits ein :-)
Freundliche Grüße
Vinzenz
Da sich das bei mir um ein Online-game handelt, wird es keine Reform geben! Daher brauch ich jetzt schon diese Lösung!
Hallo
Sorry, ich dachte, so ist mein Problem vielleicht einfacher zu verstehen! :-(
Nein. Wenn Du in der Spalte "wert" irgendwelche Zeichenketten stehen hast, dann kann man natürlich nicht damit rechnen, das macht die Sache komplizierter.
Mit dem, was uns jetzt bekannt ist, könntest Du das wie folgt lösen:
SELECT
...,
punkte / (
[link:http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html@title=CASE]
WHEN wert = 'bla' THEN 1
WHEN wert = 'blubb' THEN 2 -- Systematik sollte klar sein
ELSE 4
) AS PunkteGewichtet
...
Das ist nicht schön, das ist nicht wirklich wartbar - weder in der DB noch im PHP-Code (falls Du es dort erledigen willst).
Du solltest daher Deine Datenbankstruktur überdenken. Führe z.B. eine Zuordnungstabelle mit der Zuordnung Deiner Zeichenketten zur entsprechenden Gewichtung ein, versehe diese Zuordnungstabelle mit einem künstlichen Schlüssel, speichere in der anderen Tabelle nur den Schlüsselwert und nicht den Text ab. Die nächste Ligenreform kommt bestimmt ;-)
Freundliche Grüße
Vinzenz
... AS PunkteGewichtet
Muss ich da noch irgendwas im Quelltext ändern?
hi,
... AS PunkteGewichtet
Muss ich da noch irgendwas im Quelltext ändern?
Schau dir erst mal an, was du damit herausbekommst - im phpMyAdmin, oder auch in dem du dir einen Datensatz im PHP-Script komplett anzeigen lässt (print_r/var_dump).
gruß,
wahsaga
SELECT
...,
punkte / (
[link:http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html@title=CASE]
WHEN wert = 'bla' THEN 1
WHEN wert = 'blubb' THEN 2 -- Systematik sollte klar sein
ELSE 4
) AS PunkteGewichtet
...
Bringt mir damit ein Fehler in der darauffolgende While-Schleife.
hi,
Bringt mir damit ein Fehler in der darauffolgende While-Schleife.
Muss man dir wieder erklären, dass eine Aussage "bringt mir (irgend-)einen Fehler" wenig taugt?
gruß,
wahsaga
Hallo
SELECT ...
[link:http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html@title=CASE]
WHEN wert = 'bla' THEN 1
WHEN wert = 'blubb' THEN 2 -- Systematik sollte klar sein
ELSE 4
END -- hatte ich vergessen :-)
) AS PunkteGewichtet
Bringt mir damit ein Fehler in der darauffolgende While-Schleife.
Nein, schon vorher, d.h. bereits mysql_query() liefert einen Fehler zurück, den Du mit mysql_error() abfragen kannst, da ich in der Anweisung das END vergessen hatte - und die SQL-Anweisung somit syntaktisch falsch war. Allerdings solltest Du meinen Code auch nicht kritiklos abschreiben, sondern in der von mir extra verlinkten Doku nachlesen, was Du da machst. Dann hätte Dir meine Unterlassung auffallen können.
Grundsätzlich gilt, dass Du bei Anfragen an die DB _stets_ überprüfen solltest, ob das auch funktioniert hat - und den Fehlerfall geeignet behandeln.
Freundliche Grüße
Vinzenz