badcoder: PHP-Sortierbefehl für MySQL-Tabelle

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!

  1. 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.

  2. 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

  3. 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

    1. 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 zahlenADDreiheDECIMAL( 10.4 ) NOT NULL
      2. ALTER TABLE zahlenADD INDEX (reihe )
      3. UPDATE zahlenSETreihe=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.

      1. 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  
          
        Danke!! Das funktioniert :-D
        
        1. 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  
          >   
          > 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).
          
          1. 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.

      2. 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