AndreasN: ORDER BY für MySQL+PHP

Hallo ihr,

ich versteh es langsam nicht mehr, ich hab jetzt mehr als eine Stunde im Netz gesucht und bin eigentlich acih fündig geworden, dennoch bekomme ich es nie so hin, wie es überall steht.

Folgendes: Ich habe eine Artikel-Tabelle mit folgenden Feldern:
bild, vk_preis

Nun möchte ich sie so sortieren, dass, falls ein Bild vorhanden ist, diese Aritkel als erstes ausgegeben werden, dann natürlich in der richtigen Reihenfolge des Verkaufspreises (vk_preis).

Meine Idee: ORDER BY bild DESC, vk_preis ASC

  • die Preise (vk_preis) sind in der MySQL-Tabelle in DECIMAL 10,2 gesetzt = Beispiel 1.99
  • die Bilder haben nur ne Bild-ID-Nummer, wenn ein Bild vorhanden ist, sonst nichts

So sollte es am Ende aussehen:
ArtNr  Bild  VK-Preis
00007  ja    1,99
00001  ja    3,49
00006  ja    4,99
00003  nein  5,99
00002  nein  6,00
00005  nein  6,20
00004  nein  6,99

Aber mit meinem Befehl kommt dies:
ArtNr  Bild  VK-Preis
00001  ja    3,49
00006  ja    4,99
00007  ja    1,99
00002  nein  6,00
00003  nein  5,99
00005  nein  6,20
00004  nein  6,99

Mein endgültiger Befehl:
FROM ".TabShopArtikel." WHERE warengruppennummer = '".$row_wgr[warengruppennummer]."' AND sprachen_nr = '".$lg."' AND sichtbar = 1 AND (kennzeichnung = 'K' OR kennzeichnung = 'S' OR kennzeichnung = 'k' OR kennzeichnung = 's') ORDER BY bild DESC, vk_preis ASC LIMIT ".$next.", ".$limit."");

  1. yo,

    von welchen datentyp is den die stpalte vk_preis ?

    Ilja

    1. yo,

      von welchen datentyp is den die stpalte vk_preis ?

      Ilja

      Feld      Typ             Attribute  Null  Standard
      vk_preis  decimal(10,2)              Nein  0.00

      1. yo,

        erst noch einen kleinen tipp, benutze den IN operator für die OR Verknüpfungen über die gleiche spalte, liest sich einfacher.

        zu deinem problem, ich kann so auf den ersten blick kein problem in der abfrage erkennen. aber hast du die komplette query mal ausgegeben und dann an einer konsole ausgeführt, also direkt an die datenbank geschickt ohne eine andere applikation dazwischen, bzw. poste mal hier die reine sql abfrage ohne variablen als platzhalter.

        ein anderes problem könnte die spalte bild sein, welche werte dort genau drinne stehen, schließlich wird danach zuerst sortiert. prüfe mal die werte die dort drinne stehen, besonders die längen der inhalte, um leerzeichen aufzusprüren.

        Ilja

        1. yo,

          ein anderes problem könnte die spalte bild sein, welche werte dort genau drinne stehen, schließlich wird danach zuerst sortiert. prüfe mal die werte die dort drinne stehen, besonders die längen der inhalte, um leerzeichen aufzusprüren.

          Ilja

          Das wird es sein, da meine Bild-ID wie folgt aufgebaut ist:

          YYYYmmddHHiiss
          20070429143402

          Daher stehen natürlich die aktuellsten Bilder ganz oben.
          Es wird halt nicht überprüft ob überhaupt ein Bild vorhanden ist, sondern es wird nach numerischer Reihenfolge sortiert. Danke für den Tipp, ich hoffe ich kann es irgendwie beeinflussen.

          Gruß
          Andreas

          1. hi,

            Das wird es sein, da meine Bild-ID wie folgt aufgebaut ist:

            YYYYmmddHHiiss
            20070429143402

            Daher stehen natürlich die aktuellsten Bilder ganz oben.

            Wenn du das aber bei der Sortierung überhaupt nicht berücksichtigen willst - dann solltest du nicht danach sortieren :-)

            Es wird halt nicht überprüft ob überhaupt ein Bild vorhanden ist, sondern es wird nach numerischer Reihenfolge sortiert. Danke für den Tipp, ich hoffe ich kann es irgendwie beeinflussen.

            Unter der Annahme, dass "kein Bild vorhanden" gleichbedeutend mit dem Spaltenwert NULL ist - bastle dir mittels IF und ISNULL einen Wert zusammen, welches für nicht-vorhandenes Bild 0, für vorhandenes 1 liefert - und verwende diesen als erstes Sortierkriterium.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Unter der Annahme, dass "kein Bild vorhanden" gleichbedeutend mit dem Spaltenwert NULL ist - bastle dir mittels IF und ISNULL einen Wert zusammen, welches für nicht-vorhandenes Bild 0, für vorhandenes 1 liefert - und verwende diesen als erstes Sortierkriterium.

              gruß,
              wahsaga

              Richtige Annahme!
              Könntest du es mir eventuell bitte an einem Code-Beispiel genauer erklären, dass ist Neuland für mich mit "ISNULL".

              Gruß,
              Andreas

              1. hi,

                Könntest du es mir eventuell bitte an einem Code-Beispiel genauer erklären, dass ist Neuland für mich mit "ISNULL".

                http://dev.mysql.com/doc/refman/4.1/en/comparison-operators.html#function_isnull
                http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html#function_if

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. hi,

                  Könntest du es mir eventuell bitte an einem Code-Beispiel genauer erklären, dass ist Neuland für mich mit "ISNULL".

                  http://dev.mysql.com/doc/refman/4.1/en/comparison-operators.html#function_isnull
                  http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html#function_if

                  gruß,
                  wahsaga

                  Vielen Dank, dass war die Lösung (Nummer 1).
                  Doch dank deinem Link hab ich hab auf der Seite noch ein wenig weiter gesurft und am Ende diese Lösung für mich entdeckt:

                  ORDER BY
                    bild <> '' DESC,
                    vk_preis ASC

                  Gruß