MADU: (MYSQL) Bestimmten Feldwert an erste Stelle sortieren

Hallo,

Ich wende mich mit einer MySQL4.0-Frage an Euch.

Gegeben sei eine Tabelle "doc" mit einem Feld "name" vom Typ Varchar, "name" ist gleichzeitig der Primärschlüssel.
Ich selektiere die Werte mit dem Query "SELECT name FROM doc ORDER BY name".

Nun ist es möglich, daß ein Wert von "name" gleich "index" ist. Diesen Wert möchte ich jedenfalls an _erster Stelle_ im Resultat haben, die restlichen Werte sollen alphabetisch sortiert sein.

Meine Frage: Komme ich umhin, in der Tabelle ein neues Sortierfeld für diese Anforderung anzulegen?
Ich möchte nach Möglichkeit vermeiden, ein Feld namens "DuBistDerIndex" anzulegen, denn diese Information ist ja bereits aus dem Wert von "name" ersichtlich.

Wie löst man das elegant?

lg
MADU

--
Von einem gewissen Punkt an gibt es keine Rückkehr mehr. Dieser Punkt ist zu erreichen.
--Franz Kafka
  1. Hallo,

    Sorry, ich hätte nicht so vorschnell posten sollen.
    Ich habe direkt nach dem Post eine Abfrage versucht, in die ich nicht allzuviel Hoffnung gesetzt hatte, die aber überraschenderweise das gewünschte Ergebnis bringt:

    SELECT name FROM doc ORDER BY name='index' DESC, name

    lg
    MADU

    1. SELECT name FROM doc ORDER BY name='index' DESC, name

      SELECT
       name
      FROM
       doc
      ORDER BY
       name='index' DESC,
       name

      LOL, das funktioniert?!

      Was mit den "name"n nach "index"?

      1. Hallo,

        SELECT name FROM doc ORDER BY name='index' DESC, name
        LOL, das funktioniert?!
        Was mit den "name"n nach "index"?

        Ja, es funktioniert - mich hatte das auch überrascht.

        Die "name"n nach "index" werden alphabetisch sortiert, so wie ich es wollte. Ich denke, MySQL wertet den Ausdruck "name='index'" aus und errechnet dafür ein Ergebnis true oder false bzw. 1 oder 0. Und nach 1|0 läßt es sich trefflich sortieren.

        lg
        MADU

        --
        Von einem gewissen Punkt an gibt es keine Rückkehr mehr. Dieser Punkt ist zu erreichen.
        --Franz Kafka
        1. Die "name"n nach "index" werden alphabetisch sortiert, so wie ich es wollte. Ich denke, MySQL wertet den Ausdruck "name='index'" aus und errechnet dafür ein Ergebnis true oder false bzw. 1 oder 0. Und nach 1|0 läßt es sich trefflich sortieren.

          Ich hatte eher in der WHERE-Klausel eine dementsprechende Bedingung erwartet, also ein "WHERE (name >= 'index')" (wenn zulaessig :).

          Deine Annahme bzgl. der Auswertung des Ausdrucks schiëint mir unrichtig.

          Du willst doch alle Namen, die "index" vorangehen und zwar sortiert, oder?

          1. Hallo,

            Du willst doch alle Namen, die "index" vorangehen und zwar sortiert, oder?

            Nein.

            Ich will alle Namen, alphabetisch sortiert.
            Lediglich "index" soll aus alphabetischen Sortierung ausbrechen und _immer_ an erster Stelle erscheinen.

            Also z.B.:

            1. index
            2. apfel
            3. birne
            4. zitrone

            und nicht wie bei normaler alphabetischer Sortierung:

            1. apfel
            2. birne
            3. index
            4. zitrone

            Und genau das funktioniert mit dem vorhin von mir genannten Query.

            lg
            MADU

            --
            Von einem gewissen Punkt an gibt es keine Rückkehr mehr. Dieser Punkt ist zu erreichen.
            --Franz Kafka
        2. echo $begrüßung;

          SELECT name FROM doc ORDER BY name='index' DESC, name
          LOL, das funktioniert?!
          Was mit den "name"n nach "index"?
          Ja, es funktioniert - mich hatte das auch überrascht.
          Die "name"n nach "index" werden alphabetisch sortiert, so wie ich es wollte. Ich denke, MySQL wertet den Ausdruck "name='index'" aus und errechnet dafür ein Ergebnis true oder false bzw. 1 oder 0. Und nach 1|0 läßt es sich trefflich sortieren.

          Was man möglicherweise leicht übersehen kann, und was du auch nicht weiter erwähnt hast, ist die zweite Sortierbedingung »name«, die der ersten mit dem Vergleich folgt. Diese ist für die alphabetische Ordnung der restlichen Namen zuständig.

          echo "$verabschiedung $name";

  2. Wie löst man das elegant?

    Mit einem SELECT, in dem ein weiteres SELECT mittels UNION-Operator so zu sagen eingebettet ist, z.B.:

    SELECT
     DF1,
     DF2
    FROM
     DT1
    WHERE
     (DF1 = "DF1_Value")
    UNION SELECT
     DF1,
     DF2
    FROM
     DT1
    WHERE
     (DF1 <> "DF1_Value")
    ORDER BY
     DF1 ASC

    Vorsicht, Anfuehrungszeichen bitte ggf. durch Hochkomata ersetzen.