Tine: Preise sortieren - Sortierung ist trotzdem falsch!

Hallo!

Ich möchte aus der mysql Datenbank Preise absteigend sortieren nur es wird mir das falsche ergebnis geliefert.

Kann mir jemand sagen wie ich das am besten umgehen kann?

$result = mysql_query("SELECT * FROM artikel ORDER BY 'ART_PREIS' ASC");

Ausgabe:

1,00
10,00
11,00
12,00
13,00
14,00
15,00
16,00
17,00
18,00
19,00
2,00
20,00
21,00

Gruß Tine

  1. Du musst die Werte in Zahlen konvertieren.

    Mit einer Access-Datenbank geht das so:

    ORDER BY cdbl(ART_PREIS)

    MySQL weiss ich nicht.

    Gruss,
    Daniel

    1. hi,

      du musst die zahlen mit nem punkt und nicht mit nem komma in die datenbank reinschreiben.

      1. hi,

        du musst die zahlen mit nem punkt und nicht mit nem komma in die datenbank reinschreiben.

        Es war tatsächlich als TEXT definiert

        Aber das mit dem Punkt oder Komma ist das nicht egal?

        1. hi,

          du musst die zahlen mit nem punkt und nicht mit nem komma in die datenbank reinschreiben.

          Es war tatsächlich als TEXT definiert

          Aber das mit dem Punkt oder Komma ist das nicht egal?

          also zu 100% bin ich mir jetzt nicht sicher, aber z.B. in Perl wird es beachtet. aber wenn es bei mysql jetzt richtig sortiert wird, dann wird es wohl da egal sein.

          1. hi,

            du musst die zahlen mit nem punkt und nicht mit nem komma in die datenbank reinschreiben.

            Es war tatsächlich als TEXT definiert

            Aber das mit dem Punkt oder Komma ist das nicht egal?

            also zu 100% bin ich mir jetzt nicht sicher, aber z.B. in Perl

            »»wird es beachtet. aber wenn es bei mysql jetzt richtig sortiert
            »»wird, dann wird es wohl da egal sein.

            »»
            kann ich in der Datenbank keine Komma Stellen abspeichern?

            Wenn ich dort den Preis von 2.35 eingebe schneidet die Datenbank die Nachkommastellen ab?

            Ich habe es nun als int definiert!

            1. Hallo Tine

              Wenn ich dort den Preis von 2.35 eingebe schneidet die Datenbank die Nachkommastellen ab?

              Ich habe es nun als int definiert!

              Ein Int(eger) typ ist eine Ganzzahl und hat damit keine Nachkommastellen.
              mysql hat bestimmt Möglichkeiten auch Dezimalzahlen zu speichern, aber einfacher kannst du das Problem lösen, wenn du einfach sämtliche Preise *100 nimmst und sie dann als Ganzzahl speicherst. Der Vorteil ist, dass du dann auch keine Probleme mehr mit Englischer / Deutscher Dezimaltrennung hast, da du das Trennzeichen bei der Aus/Eingabe selbst festlegen kannst.

              Grüsse,
                Christian

              --
              Erfahrung ist die Summe der Dummheiten, die man im Bedarfsfall wieder anwendet. (Dieter Hildebrand, Kabarettist)
              1. Hallo Tine

                Wenn ich dort den Preis von 2.35 eingebe schneidet die Datenbank die Nachkommastellen ab?

                Ich habe es nun als int definiert!
                Ein Int(eger) typ ist eine Ganzzahl und hat damit keine Nachkommastellen.
                mysql hat bestimmt Möglichkeiten auch Dezimalzahlen zu speichern, aber einfacher kannst du das Problem lösen, wenn du einfach sämtliche Preise *100 nimmst und sie dann als Ganzzahl speicherst. Der Vorteil ist, dass du dann auch keine Probleme mehr mit Englischer / Deutscher Dezimaltrennung hast, da du das Trennzeichen bei der Aus/Eingabe selbst festlegen kannst.

                Einfach *100 zunehmen ist eine schlechte Lösung. Was auch gehen würde aber es würde nunmal ein falscher Wert in der Datenbank stehen!

                jetzt habe ich ein ganz anders Problem ich habe es als decimal (8,2)   definiert nur wie ersetze ich nun den Punkt durchs Komma?

                Mit str_replace() geht es nicht ist ja auch kein string :-(
                $art_preis = str_replace (",", ".", $art_preis); // falsch

                Weiß einer ob es da was ähnliches gibt?

                1. Moin!

                  Mit str_replace() geht es nicht ist ja auch kein string :-(
                  $art_preis = str_replace (",", ".", $art_preis); // falsch

                  number_format() ist für sowas ganz gut geeignet. Aus der Datenbank kommen Zahlen (PHP versteht sie jedenfalls so), und number_format() macht daraus eine vernünftige Ausgabe. Mit Formatierung, Nachkommastellen, Dezimal- und Tausendertrennzeichen, und so weiter...

                  Alle anderen Versuche sind dagegen Müll. :)

                  http://de3.php.net/number-format

                  - Sven Rautenberg

                  --
                  "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
    2. Du musst die Werte in Zahlen konvertieren.

      Mit einer Access-Datenbank geht das so:

      ORDER BY cdbl(ART_PREIS)

      MySQL weiss ich nicht.

      Ich habe nun eine zwischen Frage was sagt mir der folgende Satz aus?

      TINYINT[(M)] [UNSIGNED] [ZEROFILL]
      Eine sehr kleine Ganzzahl. Der vorzeichenbehaftete Bereich ist -128 bis 127. Der vorzeichenlose Bereich ist 0 to 255.

      127 sind damit die Dezimalstellen gemeint? Oder geht der Wert nur bis zur Zahl 127?

      Gruß Tine

      1. Hello,

        Ich habe nun eine zwischen Frage was sagt mir der folgende Satz aus?

        TINYINT[(M)] [UNSIGNED] [ZEROFILL]
        Eine sehr kleine Ganzzahl. Der vorzeichenbehaftete Bereich ist -128 bis 127. Der vorzeichenlose Bereich ist 0 to 255.

        127 sind damit die Dezimalstellen gemeint? Oder geht der Wert nur bis zur Zahl 127?

        Es ist die Dezimalzahl 127 als größter (positiver) Wert gemeint.
        Für Preise musst Du sicher den Typ "Decimal" wählen, damit er eine feste Anzahl Nachkommastellen erhält.

        In MySQL werden Zahlen auch binär gespeichert. Und da ist 127 eine "magische Zahl". Es ist Zwei hoch Sieben minus Eins ( 2^7-1 ).

        Ich hoffe, ich trete jetzt nicht ins Fettnäppchen, wenn ich Dir die Zahlensysteme erkläre. - - - Ach nee, lieber nicht. Schau z.B. mal bei http://netzmafia.de/skripten/dvs/index.html vorbei oder google eben mal nach "Binärsystem".

        Unter http://www.mysql.de/doc/de/Column_types.html werden die Spaltentypen von MySQL beschrieben.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    3. Hi,

      ORDER BY cdbl(ART_PREIS)

      scheint aber kein offizieller SQL-Befehl zu sein.

      E7

  2. Moin!

    Ich möchte aus der mysql Datenbank Preise absteigend sortieren nur es wird mir das falsche ergebnis geliefert.

    Kann mir jemand sagen wie ich das am besten umgehen kann?

    Deine Preise sind offensichtlich Zeichenketten. Diese werden absolut korrekt nach Zeichenkettenmanier sortiert.

    Wenn du eine andere "normale" Sortierung haben willst, dann nimm als Datentyp für den Preis einen der mannigfaltig vorhandenen Zahlentypen. Für Preise beispielsweise einen Dezimaltyp mit zwei festen Nachkommastellen.

    - Sven Rautenberg

    --
    "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)