Ares: ORDER BY scheint nicht zu funktionieren

Hallo,

ich habe eine kleine Datenbank geschrieben in der ich meine DVDs verwalte und bei der ich mit PHP Einträge erstelle und suchen kann.
So weit so gut.
Allerdings habe ich festgestellt, dass die Einträge nach dem Primärschlüssel sortiert ausgegeben werden, ich möchte sie aber nach dem Feld 'nummer' sortiert haben ('nummer' ist kein rein numerischer Wert, da ich teilweise auch Buchstaben vorsetze)
Folgender Befehl geht an die Datenbank

SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC

Was mache ich falsch, da das Ergebnis immernoch nach dem Primäschlüssel sortiert ausgegeben wird?

Ares

  1. SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC

    Du könntest genauso ORDER BY 42 ASC schreiben, hätte den selben Effekt. Da du nach einem in jedem Datensatz gleichen String sortierst, wird dieser auf die Sortierung keinen Einfluss haben.
    Wenn du nach der Spalte "nummer" sortieren wolltest, lass die Anführungsstriche weg.

    Gruß,
    Andreas

    1. SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC

      Du könntest genauso ORDER BY 42 ASC schreiben, hätte den selben Effekt. Da du nach einem in jedem Datensatz gleichen String sortierst, wird dieser auf die Sortierung keinen Einfluss haben.
      Wenn du nach der Spalte "nummer" sortieren wolltest, lass die Anführungsstriche weg.

      Gruß,
      Andreas

      Hilfe ist das peinlich wie einfach mein Fehler war :(

      Danke!

      Nun wird sortiert, aber leider kommen die Ergebnisse in der Reihenfolge
      1
      10
      100
      101
      ...

      kann ich das so

      1
      2
      3
      ...
      10
      11
      12
      ...
      100
      101

      sortieren lassen, ohne dass ich

      001
      002
      ...

      als Nummer schreiben muss?

      Gruß
      Ares

      1. Hallo,

        SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC
        Hilfe ist das peinlich wie einfach mein Fehler war :(

        Danke!

        1
        10
        100
        101
        ...

        das liegt an Deinem Tabellendesign.

        kann ich das so

        1
        2
        3
        ...
        10
        11
        12
        ...
        100
        101

        sortieren lassen, ohne dass ich

        Verwende statt des zusammengesetzten Wertes zwei Spalten, eine für die vorgesetzten Buchstaben, eine für ganze Zahlen mit entsprechendem Typ.

        Freundliche Grüße

        Vinzenz

        1. Hallo

          Verwende statt des zusammengesetzten Wertes zwei Spalten, eine für die vorgesetzten Buchstaben, eine für ganze Zahlen mit entsprechendem Typ.

          Freundliche Grüße

          Vinzenz

          Ok hab die Buchstaben in die Spalte 'prefix' geschrieben und die Nummer als int gesetzt.
          Nun habe ich nur das Problem, dass ich beim Eintragen einer DVD der Nummer ein Duplikat-Fehler auf der Nummer bekomme.
          Ich habe aber den Index schon auf prefix UND nummer erweitert.
          Eigentlich sollte der Fehler nun nicht auftreten, oder muss ich die ganze Tabelle nochmal neu schreiben um den alten Index vollständig zu überschreiben?

          Gruß
          Ares

          1. echo $begrüßung;

            Bitte nur die relevanten Teile zitieren, auf die du dich beziehst. Danke.

            Ok hab die Buchstaben in die Spalte 'prefix' geschrieben und die Nummer als int gesetzt.
            Nun habe ich nur das Problem, dass ich beim Eintragen einer DVD der Nummer ein Duplikat-Fehler auf der Nummer bekomme.

            Beschreibe die Umstände bitte genauer.

            Ich habe aber den Index schon auf prefix UND nummer erweitert.

            Nicht dass du da einen Fehler gemacht hast. Wie sieht die Struktur jetzt aus? (SHOW CREATE TABLE name)

            Eigentlich sollte der Fehler nun nicht auftreten, oder muss ich die ganze Tabelle nochmal neu schreiben um den alten Index vollständig zu überschreiben?

            Wenn der Unique/Primar-Index beim Umschreiben stört, entfern ihn und füge ihn anschließend wieder hinzu.

            echo "$verabschiedung $name";

            1. Es klappt jetzt.
              Ich hatte einen Fehler in PHP, wobei der Wert für prefix nicht ordentlich übergeben wurde. Daher, da prefix leer war, hat er natürlich die vorhandene DVD 100 nicht von der neuen unterscheiden können und gemeckert.

              Jetzt läuft es aber flüssig und wunderbar :)

              Vielen herzlichen Dank für eure Hilfe

              Schönes Wochenende noch

              Ares

      2. Hi,

        Nun wird sortiert, aber leider kommen die Ergebnisse in der Reihenfolge
        1
        10
        100

        Deine Spalte nummer scheint ein String zu sein. Warum?
        Wenn dort nur Nummern enthalten sind, bietet sich eine numerische Spalte statt einer String-Spalte an.

        Wesentlich ineffizienter, aber auch möglich, wäre ein typecast vor der Sortierung (wie der genau aussieht, hängt vom DB-System ab - da Du nicht gesagt hast, was Du benutzt, mußt Du jetzt eben selbst im Handbuch Deines Systems danach suchen).

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      3. echo $begrüßung;

        Nun wird sortiert, aber leider kommen die Ergebnisse in der Reihenfolge
        1
        10
        100
        kann ich das so
        1
        2
        3
        10
        11
        12
        sortieren lassen, ohne dass ich
        001
        002
        als Nummer schreiben muss?

        Das geht nur dann, wenn dein DBMS die so genannte Natural Sort Order unterstützt. MySQL kann das nicht. Neben der von Vinzenz vorgeschlagenen günstigeren Tabellenstrukturierung gibt es weitere Alternativen.

        Du schreibst dir für dein DBMS eine Funktion, die dir den sortierfähigen Wert zurückliefert, also aus A1 ein A001 macht, und gibst die als Sortierkriterium an.

        Du sortierst in PHP mit usort() und strnatcmp()/strnatcasecmp(). Das setzt voraus, dass du die Ergebnismenge komplett abgeholt und zwischengespeichert hast. Bei einer "haushaltsüblichen" DVD-Sammlung dürfte der dabei anfallende zusätzliche Speicherverbrauch problemlos verkraftbar sein.

        echo "$verabschiedung $name";

  2. Hi,

    Allerdings habe ich festgestellt, dass die Einträge nach dem Primärschlüssel sortiert ausgegeben werden,

    Nein, sie kommen in zufälliger Reihenfolge.

    SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC

    Dieses SQL-Statement dürfte eine Fehlermeldung erzeugen, da $suchfeld in der WHERE-Clause nicht sinnvoll ist.
    Merke: Für SQL-Probleme ist PHP-Code irrelevant.

    Was mache ich falsch,

    Du sortierst nach dem String 'nummer' statt nach der Spalte nummer.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.