PHP-Sortierbefehl für MySQL-Tabelle
badcoder
- php
Hallo zusammen!
Ich möchte die Datensätze aus meiner MySQL-Tabelle (tabelle) nach den Werten in einer bestimmten Spalte (spaltenname) sortieren und zwar so, dass der Datensatz mit dem höchsten Wert in der Spalte (spaltenname) angezeigt wird. Dabei können die Werte in der betreffenden Spalte sowohl positiv wie auch negativ bzw. 0 oder NULL sein.
Wenn -1,+1,-10, dann soll er -10 als größten Wert zurückgeben.
Leider funktioniert das so nicht:
``mysql_query("SELECT * FROM tabelle ORDER BY spaltenname DESC LIMIT 1") or die(mysql_error());
Danke!
Tach!
Ich möchte die Datensätze aus meiner MySQL-Tabelle (tabelle) nach den Werten in einer bestimmten Spalte (spaltenname) sortieren und zwar so, dass der Datensatz mit dem höchsten Wert in der Spalte (spaltenname) angezeigt wird. Dabei können die Werte in der betreffenden Spalte sowohl positiv wie auch negativ bzw. 0 oder NULL sein.
Du möchtest also nicht den höchsten Wert sondern den höchsten absoluten Wert haben. Für die Absolutwert-Ermittlung gibt es eine Funktion unter den numerischen Funktionen.
Leider funktioniert das so nicht:
"Funktioniert nicht" funktioniert nicht als Fehlerbeschreibung. Bitte beobachte und beschreibe genauer, was du erwartest und was du stattdessen bekommst.
``mysql_query("SELECT * FROM tabelle ORDER BY spaltenname DESC LIMIT 1") or die(mysql_error());
Du hast ein Datenbank-Problem, also brauchst du keinen PHP-Code zu posten und der richtige Themenbereich wäre dann auch ein anderer als PHP.
Mit PHP wäre das Problem übrigens auch nicht anders lösbar. Allerdings müsstest du dann sämtliche Datensätze aus der Tabelle abfragen.
dedlfix.
Hallo badcoder
Ich möchte die Datensätze aus meiner MySQL-Tabelle (tabelle) nach den Werten in einer bestimmten Spalte (spaltenname) sortieren und zwar so, dass der Datensatz mit dem höchsten Wert in der Spalte (spaltenname) angezeigt wird. Dabei können die Werte in der betreffenden Spalte sowohl positiv wie auch negativ bzw. 0 oder NULL sein.
Wenn -1,+1,-10, dann soll er -10 als größten Wert zurückgeben.Leider funktioniert das so nicht:
``mysql_query("SELECT * FROM tabelle ORDER BY spaltenname DESC LIMIT 1") or die(mysql_error());
Das Problem ist, dass -10 nicht der grösste _Wert_ ist, sondern lediglich die grösste _Ziffer_
Versuchs, indem du den grössten und den kleinsten Eintrag deiner Tabelle ausliest, beim kleinsten ein allfälliges Vorzeichen streichst und die beiden dann miteinander vergleichst.
Das könnte so aussehen, falls deine Tabelle eine Spalte 'ID' mit Primärschlüssel hat. Kannst du ja auch nach anfügen...
$groesster_Wert= mysql_fetch_assoc(mysql_query("SELECT ID, spaltenname FROM tabelle ORDER BY spaltenname DESC LIMIT 1"));
$kleinster_Wert= mysql_fetch_assoc(mysql_query("SELECT ID, spaltenname FROM tabelle ORDER BY spaltenname ASC LIMIT 1"));
//Vorzeichen entfernen, falls vorhanden
if (is_int(strpos($kleinster_Wert['spaltenname'], '-'))) {
$kleinster_Wert['spaltenname'] = substr($kleinster_Wert['spaltenname'], 1);
}
//Werte vergleichen und richtigen aussuchen
if ($kleinster_Wert['spaltenname'] > groesster_Wert['spaltenname']) {
$dein_gesuchter_Eintrag = mysql_query("SELECT * FROM tabelle WHERE ID = '".$kleinster_Wert['ID']."'");
}
else {
$dein_gesuchter_Eintrag = mysql_query("SELECT * FROM tabelle WHERE ID = '".$groesster_Wert['ID']."'");
}
PS: wenn du willst, dass etwas im Forum als Code dargestellt wird, musst du es zwischen die "Code-Tags" schreiben
Danke!
MfG
Solero
Vielleicht funktioniert's ja so in diesem Krauter-Datenbanksystem:
SELECT * FROM Tabelle ORDER BY ABS(spaltenname) ASC LIMIT 1
Wo soll er denn NULL einsortieren? Wie 0 oder nicht relevant?
Wenn NULL wie 0, dann
SELECT * FROM Tabelle ORDER BY ABS(COALESCE(spaltenname, 0)) ASC LIMIT 1
Wenn ohne NULLs, dann
SELECT * FROM Tabelle WHERE spaltenname IS NOT NULL ORDER BY ABS(spaltenname) ASC LIMIT 1
Ciao, Frank
Krauter-Datenbanksystem
... das immerhin zu Oracle gehört und in dessen Datenbankengine SAP einiges gewiss nicht uneigennützig eingebracht hat. Welches dieser beiden Unternehmen möchtest Du als "Krauter" bezeichnen?
SELECT zahl, ABS( zahl ) AS reihe
FROM zahlen
ORDER BY reihe DESC
LIMIT 1
würde mit dem angegebenen Beispiel [1,0,-10] die 10 als absoluten Betrag bringen
SELECT `zahl`, ABS( `zahl` ) AS `reihe`
FROM `zahlen`
ORDER BY `reihe` DESC
LIMIT 1
Bringt das, was der Frager wohl erwartet.
zahl reihe
-10 10
WICHTIGE Hinweise:
1. Voraussetzung ist, dass die Tabelle auch Zahlen und keinen Text enthält. Das NULL enthalten sein können soll erweckt bei einen ganz argen Verdacht.
2. Es muss bei jeder Abfrage die gesamte Tabelle durchgerechnet und das Ergebnis sortiert werden - hier sollte schon beim Eintragen der Werte die Berechnung durchgeführt werden damit auch die Spalte 'reihe' indexiert werden kann. Sonst dauert das Abfragen möglicherweise sehr lang.
Mit
1. ALTER TABLE
zahlenADD
reiheDECIMAL( 10.4 ) NOT NULL
2. ALTER TABLE
zahlenADD INDEX (
reihe )
3. UPDATE
zahlenSET
reihe=ABS(
zahl )
kann man das auch nachträglich machen.
Dann muss man nur ein
SELECT `zahl`
FROM `zahlen`
ORDER BY `reihe` DESC
LIMIT 1
abfragen um das wohl erwünschte Ergebnis -10 zu erhalten.
SELECT zahl
, ABS( zahl
) AS reihe
FROM
zahlen
ORDER BYreihe
DESC
LIMIT 1
>
> Bringt das, was der Frager wohl erwartet.
>
> zahl reihe
> -10 10
Danke!! Das funktioniert :-D
SELECT zahl
, ABS( zahl
) AS reihe
FROM
zahlen
ORDER BYreihe
DESC
LIMIT 1
> >
> > Bringt das, was der Frager wohl erwartet.
> >
> > zahl reihe
> > -10 10
>
> Danke!! Das funktioniert :-D
Mag sein, aber wenn die Zahl der Datensätze steigt wird es zu lange dauern. [Nimm deshalb bitte den Rest ernst](https://forum.selfhtml.org/?t=212154&m=1448667).
Tach!
Mag sein, aber wenn die Zahl der Datensätze steigt wird es zu lange dauern. Nimm deshalb bitte den Rest ernst.
Aber nicht blind im vorauseilendem Gehorsam. Wenn die Anzahl sehr klein bleiben wird, lohnt es sich nicht. Wobei alles unter 1 Mio durchaus auch noch als klein betrachtet werden kann. Zudem ist MySQL bei ABS() sehr wohl in der Lage einen auf der Spalte liegenden Index zu verwenden. EXPLAIN zeigt einem das.
Am besten ist, man probiert das Laufzeitverhalten und schaut sich dazu an, was EXPLAIN sagt, mit einer realistisch großen Datenmenge. Der Optimizer arbeitet nämlich auch unterschiedlich, je nach Datenanzahl. Zum Beispiel kann man nicht bei einem Test mit 3 Datensätzen und der EXPLAIN-Aussage "full table scan" darauf schließen, dass das bei vielen Datensätzen so bleibt.
dedlfix.
Krauter-Datenbanksystem
... das immerhin zu Oracle gehört und in dessen Datenbankengine SAP einiges gewiss nicht uneigennützig eingebracht hat. Welches dieser beiden Unternehmen möchtest Du als "Krauter" bezeichnen?
Alle 3.
Stelle grad fest, dass ich statt ASC haette DESC schreiben sollen. Aber du hast das ja nochmal fix aufgewaermt.
Cheers, Frank