Eddie: MySQL, wie ist das normale Ergebnis geordnet?

Hallo allerseits,
koennt ihr mir sagen, was ich bei dieser Abfrage rausbekomme:

"SELECT id FROM myTable
WHERE id = 2
OR id = 1
OR id = 3"

bekomme ich da 1,2,3 (schlecht) oder 2,1,3 (besser) oder vielleicht irgendwas vollkommen sinnlos geordnetes?

Danke,
Eddie

  1. "SELECT id FROM myTable
    WHERE id = 2
    OR id = 1
    OR id = 3"

    bekomme ich da 1,2,3 (schlecht) oder 2,1,3 (besser) oder vielleicht irgendwas vollkommen sinnlos geordnetes?

    Hallo Eddie,

    das nicht determinierbare Ergebnis ist abhängig von einer Reihe von Faktoren, u.a. von der Reihenfolge der DS in der abgefragten Tabelle und der Vorgehensweise von MySQL bei der Ausführung des SELECTs (welche ihrerseits nicht determinierbar ist).

    Woher kommt die verquere Annahme, daß die Reihenfolge 2,1,3 von besserer Qualität sei als 1,2,3 und andere Reihenfolgen sinnlos geordnet seien? Der Sinn von 2,1,3 erschließt sich mir nicht unmittelbar... Denkst Du etwa, die Anordnung der Vergleiche in der WHERE-Klausel hätte darauf einen Einfluß? Nein!

    Wenn Du bestimmte Reihenfolgen erwartest, dann lege Sie selbst fest (zum Beispiel mit entsprechenden Spalten und der ORDER-BY-Klausel).

    HTH Robert

    1. Danke Robert,

      zum Thema

      verquere Annahme

      Nimm einfach an, ich kann per Formular die gewuenschte chaotische Reihenfolge festlegen und will das Ergebnis in einer einzigen DB-Abfrage generieren.
      Bisher hatte ich fuer obiges Beispiel 3 einzelne Abfragen in der richtigen Reihenfolge.

      Gruss, Eddie

      1. Hallo Eddie,

        Nimm einfach an, ich kann per Formular die gewuenschte chaotische Reihenfolge festlegen und will das Ergebnis in einer einzigen DB-Abfrage generieren.
        Bisher hatte ich fuer obiges Beispiel 3 einzelne Abfragen in der richtigen Reihenfolge.

        was auch immer die Motive für Deine Annahme sein mögen, ich wäre überrascht, wenn die alternativen WHERE-Klauseln:

        WHERE (id=1) OR (id=2) OR (id=3)
          WHERE (id=2) OR (id=1) OR (id=3)
          WHERE (id=3) OR (id=2) OR (id=1)

        unterschiedlich Ergebnisordnungen erbrächten. Wenn sich also aus Deiner Aufgabenstellung eine variable, zufällige Reihenfolge für die gewünschte Ergebnismenge ergibt und diese sich nicht durch entprechende Hilfspalten oder eine sonstwie geartete Logik vorherbestimmen läßt, so dürfte der sinnvollste Anzatz darin liegen, die in einer nicht vorhersagbaren Folge geordneten Ergebnis-DS in der Weiterverarbeitung (etwa mit Perl oder PHP) entsprechend auszuwerten.

        HTH Robert

        1. so dürfte der sinnvollste Anzatz darin liegen, die in einer nicht vorhersagbaren Folge geordneten Ergebnis-DS in der Weiterverarbeitung (etwa mit Perl oder PHP) entsprechend auszuwerten.

          und so habe ich das jetzt auch gemacht!

          was auch immer die Motive für Deine Annahme sein mögen, ...

          Ok, hier die Erklaerung, weg vom Formular-Beispiel:
          ich habe auf meiner Website www.umdiewelt.de Kapitel liegen, deren Inhalt einfach als Text in der DB liegt. Die Bilder, die hier und da im Text eingestreut sind, sind einfach nur per id referenziert. Das sieht dann so aus:

          <text>blabla</text>
          <bild>1</bild>
          <text>blablub 2</text>
          <bild>2</bild>
          <bild>3</bild>

          Auf die Bilder und ihren Beschreibungstext greife ich teilweise auch selektiv zu (unabhaengig vom Text), auf die einzelnen Textabschnitte nicht, darum tun's 2 Tabellen. Der User kann jetzt aber Bilder umpositionieren.

          <text>blabla</text>
          <bild>3</bild>
          <bild>2</bild>
          <bild>1</bild>
          <text>blablub 2</text>

          Da kaeme es verdammt bloed, wenn ich beim Auslesen der Beschreibungstexte die falsche Reihenfolge erwischen wuerde und aus einer "Wurstwarenfachverkaeuferin" einen "Traumstrand" machen wuerde :-)

      2. Hi,

        wenn du die in der Reihenfolge brauchst, ich meine, ich weiß ja nicht wie deine Suchmaske aussieht, aber bei uns ist das eine Liste mit Feldern nach denen die Liste sortiert werden kann und daraus bauen wir dann die ORDER BY-Klausel dynamisch zusammen.

        Du kannst übrigens statt einzelnen Abfragen auch noch auf UNION ausweichen, ich weiß allerdings nicht, ob das performance-technisch sehr sinnvoll ist.

        Rouven