WHERE id IN (...) ORDER BY ???

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • WHERE id IN (...) ORDER BY ???

    Hi Leute,

    ich habe eine Abfrage, die mit IDs arbeitet, die in einer IN-Liste aufgeführt sind. z.B.

    SELECT * FROM table WHERE id IN (3,2,1,4,5,6)

    Nun möchte ich aber, dass die Reihenfolge der Ausgabe dieselbe ist, wie in der IN-Liste. Normalerweise würde es in der numerischen Reihenfolge ausgegeben werden.
    Wie kann ich die ORDER BY - Klausel so formulieren, dass das Gewollte rauskommt?

    arrays sind klasse

  • #2
    Code:
    SELECT * 
    FROM tabelle
    WHERE id IN (3,2,1,4,5,6)
    ORDER BY
      id=6, 
      id=5, 
      id=4, 
      id=1, 
      id=2, 
      id=3
    sollte gehen, aber lohnt das wirklich?

    wozu?
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3

      scheint doch etwas.. naja...

      zuvor habe ich die reihenfolge der auszulesenen IDs festgelegt und in eine andere Tabelle gepackt (liegt dort in einer Text-Spalte durch Komma getrennt, damit mans gleich so weiterbenutzen kann.
      In einer zweiten Tabelle will ich diese IDs nun auslesen lassen, wobei sich die Reihenfolge nicht ändern soll.
      arrays sind klasse

      Kommentar


      • #4
        ich versteh den sinn immer noch nicht so ganz, wie wär's mit einem kleinen beispiel?


        abgesehen davon sollte dein problemja jetzt gelöst sein oder?
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          wie wärs mit
          PHP-Code:
          SELECT *
          FROM tabelle 
          WHERE id IN 
          (3,2,1,4,5,6)
          ORDER BY FIELD(id,3,2,1,4,5,6
          [Test] MySQL cli Emulator

          Kommentar


          • #6
            Das Problem wäre gelöst, aber die Abfrage benötigt durch die abschließende Aufzählung der IDs erheblich mehr Zeit (so scheint es jedenfalls). Bei hunderten IDs kann das schon länger dauern.

            Die IDs liegen in einer vorher definierten Reihenfolge, die auch beibehalten werden soll.

            Bsp:

            Tabelle:
            id | inhalt
            1 | a
            2 | b
            3 | c
            4 | d
            5 | e
            6 | f

            Abfrage: "SELECT * FROM Tabelle WHERE id (3,5,1)"

            Soll ergeben: c , e , a
            und nicht: a, c, e
            arrays sind klasse

            Kommentar


            • #7
              dann versuch dich mal an NielsRunges vorschlag mit dem field

              ich hab den extra nicht erwähnt, da ich dachte, du liest die ids aus einer anderen tabelle aus, wo sie zu irgendwelchen überschriften oder so gehören und daher käme die reihenfolge zustande; dannhätte ich dich nämlich an die JOINs verwiesen
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Die JOINS sind klasse, aber hierbei nicht zu gebrauchen, da die ID-Reihenfolge anhand einiger Abfragen an mehrere Tabellen vorher generiert wird, was auch einige Sekunden in Anspruch nimmt. Daher sind die IDs vorab gespeichert.

                Habe Nils' Vorschlag probiert und es klappt - also danke an euch
                arrays sind klasse

                Kommentar


                • #9
                  Das Problem wäre gelöst, aber die Abfrage benötigt durch die abschließende Aufzählung der IDs erheblich mehr Zeit (so scheint es jedenfalls). Bei hunderten IDs kann das schon länger dauern.
                  das konnte ich nicht feststellen. Habe es jetzt nur bei einer Tabelle mit 10.000 und nicht einigen Millionen probiert aber da ging es sehr schnell.
                  [Test] MySQL cli Emulator

                  Kommentar

                  Lädt...
                  X