bjnas: Mysql Abfrage mit Liste

Hallo liebes Forum

Folgende einfache Abfrage bringt mich zum verzweifeln.

SELECT * FROM TAB WHERE ID IN(1,2,5,8,3,2,2,1)

Diese Abfrage listet jede vorhandene ID aus der Liste einmal auf. Ich möchte aber ein Resultat mit allen IDs in einer Liste mit der gleichen Reihenfolge.

zB
ID C1 C2 C3
1
2
5
8
3
2
2
1

Ist das möglich?

Danke für Eure Hilfe

Bruno

  1. Moin,

    Diese Abfrage listet jede vorhandene ID aus der Liste einmal auf. Ich möchte aber ein Resultat mit allen IDs in einer Liste mit der gleichen Reihenfolge.

    In welcher "gleichen" Reihenfolge? Die IDs im Resultat sind bei dir hier in der Reihenfolge, in der Sie in der Abfrage stehen. Wenn du sortieren willst, brauchst du ORDER BY id am Ende deiner Abfrage.

    Grüße Marco

    1. Danke für Eure Hilfe

      Mein Gedanke bei der Sache war, das MySql gewisse Aufgaben schneller erledigt als PHP.

      Darum diese Ausgabe

      Gruss

      Bjn

  2. SELECT * FROM TAB WHERE ID IN(1,2,5,8,3,2,2,1)

    So sollte es werden

    zB
    ID C1 C2 C3
    1
    2
    5
    8
    3
    2
    2
    1

    Jetzt ist es so

    ID C1 C2 C3
    1
    2
    5
    8
    3

    1. Tach!

      So sollte es werden
      Jetzt ist es so

      Geneuer gesagt: Das Ergebnis einer Abfrage ist per Definition unsortiert. Eine Sortierung gibt es nur mit ORDER BY (oder implizit bei einem GROUP BY). Alle anderen Reihenfolgen, auch solche, die durch physisches Sortieren von Tabellen zustandekommen, sind nicht garantiert. Mit anderen Worten: Ohne ein definiertes Sortierkriterium hast du keine (garantierte) Reihenfolge.

      dedlfix.

    2. SELECT * FROM TAB WHERE ID IN(1,2,5,8,3,2,2,1)

      So sollte es werden

      zB
      ID C1 C2 C3
      1
      2
      5
      8
      3
      2
      2
      1

      Jetzt ist es so

      ID C1 C2 C3
      1
      2
      5
      8
      3

      Du hast doch schon die Lösung.
      Du hast zwei Ergebnismengen. Die eine (1,2,5,8,3,2,2,1) und die andere (1,2,5,8,3) (wahrscheinlich noch mit Zusatzinformationen). Jetzt rumpelst du mit einer Schleife über die erste Ergebnismenge und merged beide zusammen.

      Gruß
      merged ("T","-","Rex")

  3. Hello Bruno,

    Folgende einfache Abfrage bringt mich zum verzweifeln.

    SELECT * FROM TAB WHERE ID IN(1,2,5,8,3,2,2,1)

    Diese Abfrage listet jede vorhandene ID aus der Liste einmal auf. Ich möchte aber ein Resultat mit allen IDs in einer Liste mit der gleichen Reihenfolge.

    Da schlägt sicherlich der Optimierer der Datenbank zu, der im Sinne der Datensparsamkeit in einer normalen konsilidierenden Abfrage nur jeden betroffenen Datensatz einmal beschafft. Wenn Du hier Datenbeschaffung und Datenformatierung (Darstellung in lesbarer Form) vermischehn willst, dann könnte Dir ggf. ein Join helfen, der dann ja auch ein karthesisches Produkt der Abfragevektoren liefern könnte.

    Aber eigentlich ist das, was Du da haben willst, eine Frage der Datenformatierung, also der Darstellung in menschlich lesbarer Form (nicht zuverewchseln mit der Darstellungsschicht der Daten!).

    Erzeuge Die aus der Ergebnismenge ein Array in der Scriptsprache deiner API und hole dann aus diesem Array gezielt die Datensätze, die Du jeweils anzeigen willst.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  4. Hi,

    Folgende einfache Abfrage bringt mich zum verzweifeln.

    SELECT * FROM TAB WHERE ID IN(1,2,5,8,3,2,2,1)

    Diese Abfrage listet jede vorhandene ID aus der Liste einmal auf. Ich möchte aber ein Resultat mit allen IDs in einer Liste mit der gleichen Reihenfolge.

    Ist das möglich?

    Ja, ist es:

    CREATE TEMPORARY TABLE foo (ord int, id int);  
    INSERT INTO foo VALUES (0,1),(1,2),(2,5),(3,8),(4,3),(5,2),(6,2),(7,1);  
    SELECT spalten FROM tab  
      RIGHT JOIN foo USING (id)  
      ORDER BY foo.ord ASC
    

    Es wird eine temporäre Tabelle erzeugt (die wieder verworfen wird, sobald die Verbindung beendet wird), in die die gesuchten IDs in vorgegebener Ordnung eingefügt werden.
    Anschließend wird sie per RIGHT JOIN an die eigentliche „Ziel“-Tabelle tab rangejoint, so dass für jeden Datensatz aus der temporären Tabelle ein Datensatz im Ergebnis landet. Und das ganze wird dann noch nach der vorgegebenen Ordnung sortiert.

    Die INSERT INTO-Zeile per Script dynamisch zu erzeugen, dürfte kein Problem sein.

    Ob das gesamte Vorgehen allerdings gegenüber dem bereits erfolgten Vorschlag, das ganze einfach nach der „normalen“ SELECTWHERE id IN()-Query per Script zusammen zu würfeln, in dem du einmal über deine vorgegebenen IDs loopst, irgendeinen nennenswerten Vorteil bietet … das bleibt dahingestellt :-)

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?