Der_Hansi: Datenbank nach bestimmter Weise sortiert ausgeben

Guten Abend,

ich sitze gerade vor einem Problem.
Ich habe eine Tabelle, die ich ausgeben möchte.
Wie man es macht ist mir klar
"SELECT * FROM gallery ORDER by cat ASC, id DESC, datum DESC"

Mein Problem ist nun aber das in der Spalte cat, drei verschiedene Möglichkeiten gibt, i, v und j, diese müssen leider zur Indifikation so bleiben.
Bei ASC werden sie nach i,j,v sortiert.
Bei DSEC werden sie nach v,j,i sortiert.

Ich benötige nun aber eine Ausgabe mit i,v,j. Wie kann ich so etwas hinbekommen?

Mit freundlichem abdendlichen Gruß
Hansi

  1. Hallo,

    Ich benötige nun aber eine Ausgabe mit i,v,j. Wie kann ich so etwas hinbekommen?

    Mit 'ner Where-Klausel. Erst die 'i', dann die 'v', dann die 'j' (drei Abfragen, evntl. lassen die sich auch zusammenfassen).

    Viele Grüße,
    Horst Haselhuhn

  2. echo $begrüßung;

    Bei ASC werden sie nach i,j,v sortiert.
    Bei DSEC werden sie nach v,j,i sortiert.
    Ich benötige nun aber eine Ausgabe mit i,v,j. Wie kann ich so etwas hinbekommen?

    Du könntest die Funktion FIELD() in der ORDER-BY-Klausel verwenden.

    echo "$verabschiedung $name";

    1. Hello,

      Du könntest die Funktion FIELD() in der ORDER-BY-Klausel verwenden.

      Gibt es diese Funktion auch bei anderen SQL-Dialekten?

      Harzliche Grüße aus dem
      verschneiten Sankt Andreasberg
      und Frohe Weihnachtszeit

      Tom

      --
      Nur selber lernen macht schlau

      1. echo $begrüßung;

        Du könntest die Funktion FIELD() in der ORDER-BY-Klausel verwenden.
        Gibt es diese Funktion auch bei anderen SQL-Dialekten?

        Das weiß ich nicht, ich habe so eine Funktionalität bisher noch nicht benötigt. Für MySQL musste ich auch erst nachschlagen, was aber nur eine Sache von wenigen Augenblicken war.

        Wenn der Fragende keine Angaben zu seinem DBMS und der Version macht, gehe ich stillschweigend von MySQL aus. Das dürfte in den meisten Fällen nicht verkehrt sein.

        Wenn es FIELD() oder eine adäquate Funktion in anderen Systemen nicht gibt, kann man sich mit Control-Flow-Funktionen, wie IF-Funktion oder ein CASE-WHEN-Konstrukt, weiterhelfen. Auch dürften die meisten Systeme benutzerdefinierte Funktionen anbieten, was sich aber für diesen Fall meiner Meinung nach noch nicht lohnt.

        echo "$verabschiedung $name";

  3. Hi,

    Ich benötige nun aber eine Ausgabe mit i,v,j. Wie kann ich so etwas hinbekommen?

    Das einzige was mir dazu einfällt wäre eine zweite Tabelle, in der du dann die Gewichtung der einzelnen cat abspeicherst.

    cat_name | cat_gewicht
    i        | 1
    v        | 2
    j        | 3

    Dann das ganze mit einem join dazunehmen und nach cat_gewicht sortieren lassen.

    mfG,
    steckl

  4. Bei ASC werden sie nach i,j,v sortiert.
    Bei DSEC werden sie nach v,j,i sortiert.

    Ich benötige nun aber eine Ausgabe mit i,v,j. Wie kann ich so etwas hinbekommen?

    Versuche es mit CASE:

    select *, case spalte when "i" then 0 when "v" then 1 when "j" then 2 end as sortierung from tabelle order by sortierung;

  5. Guten Abend,

    ich sitze gerade vor einem Problem.
    Ich habe eine Tabelle, die ich ausgeben möchte.
    Wie man es macht ist mir klar
    "SELECT * FROM gallery ORDER by cat ASC, id DESC, datum DESC"

    Mein Problem ist nun aber das in der Spalte cat, drei verschiedene Möglichkeiten gibt, i, v und j, diese müssen leider zur Indifikation so bleiben.
    Bei ASC werden sie nach i,j,v sortiert.
    Bei DSEC werden sie nach v,j,i sortiert.

    Ich benötige nun aber eine Ausgabe mit i,v,j. Wie kann ich so etwas hinbekommen?

    1. Rat
    DB vernünftig normalisieren, dann läufst Du nicht in solche Fallen.

    Falls Du Dich partout nicht von dem DB-Modell verabschieden magst (weil es vielleicht nicht von Dir ist und Du Dir die Kompatibilität zu evtl. Updates erhalten willst...)

    2. einzelne Selects in eine temoräre Tabelle, Select auf die Temptabelle, das ganze in eine Prozedur packen. Mit einem richtigen DBMS wie MS SQL geht das auch mit ein paar Hunderttausend Saetzen noch vertretbar schnell. Bei mySQL und Co: Keine Ahnung, gibt's da mittlerweile temp-Tabellen?...;)

    3. einzelne Selects mit Union-Operator zusammenfassen, also etwas in der Art:

    SELECT * From Tab WHERE spalte = i ORDER by Spalteirgendwas
    UNION SELECT * From Tab WHERE spalte = v ORDER by Spalteirgendwas
    ... etc.

    Die Verwendung von Union dürfte performancetechnisch die uneleganteste sein. Solange es nur um ein paar (Tausend) Saetze geht, ist es aber sicher die unafwendigste.

    cul,
    Falk