Stefan: SQL Abfrage sortieren

Hallo, wahrscheinlich gibts für mein Problem eine recht simple Lösung, jedoch komm ich allein irgendwie nicht drauf...
Also:
Ich habe in PHP ein Array mit IDs und will anschließend eine DB nach diesen IDs abfragen. Dazu wandle ich den Array per implode in einen String.

"SELECT * FROM ".CPO_NEWS." WHERE nr IN (22,12,3)"

Soweit kein Problem. Nun möchte ich aber das das Resultat aus der SQL-Abfrage der Reihenfolge des Arrays entspricht, und nicht der Reihenfolge wie die IDs in der DB sortiert sind.

Ich erhalten folgende Reihenfolge: 3,12,22
Gewünscht wär aber: 22,12,3

Das Problem besteht nun hauptsächlich darin, das ich nur den Query-String festlegen kann, die Ausgabe wird durch ein Script erzeugt auf das ich kein Zugriff habe... Es gibt ja zahlreiche Sortiermöglichkeiten in SQL, da kenn ich mich aber nicht mit aus. Daher hoffe ich jemand hat ne Idee.

MfG
Stefan Nowak

  1. Ich erhalten folgende Reihenfolge: 3,12,22
    Gewünscht wär aber: 22,12,3

    "ORDER BY nr DESC" an Dein SQL anhängen, allerdings hättest Du dann eine absteigende Sortierung, wenn Dein Array unsortierte nr hält, dann hast Du keine Möglichkeit mit SQL die Datensatzmenge in der gewünschten Form zu erhalten, d.h. Du müsstest dann Dein Array vorsortieren.

  2. Hallo Stefan,

    Soweit kein Problem. Nun möchte ich aber das das Resultat aus der SQL-Abfrage der Reihenfolge des Arrays entspricht, und nicht der Reihenfolge wie die IDs in der DB sortiert sind.

    Du könntest es mit Hilfe von FIELD() ungefähr so versuchen:

    SELECT
     FIELD(id, 4,5,1) as orderby,
     A.*
    FROM
     table AS A
    WHERE
     id IN (4,5,1)
    ORDER BY
     orderby

    Viele Grüße

    Stefan

    --
    bythewaythewebsuxgoofflineandenjoytheday
  3. Hallo Stefan,

    Hallo, wahrscheinlich gibts für mein Problem eine recht simple Lösung, jedoch komm ich allein irgendwie nicht drauf...

    das hängt davon, was Du unter "simpel" verstehst.

    Ich habe in PHP ein Array mit IDs und will anschließend eine DB nach diesen IDs abfragen. Dazu wandle ich den Array per implode in einen String.

    "SELECT * FROM ".CPO_NEWS." WHERE nr IN (22,12,3)"

    Soweit kein Problem. Nun möchte ich aber das das Resultat aus der SQL-Abfrage der Reihenfolge des Arrays entspricht, und nicht der Reihenfolge wie die IDs in der DB sortiert sind.

    Du benötigst dazu eine Hilfsspalte, nach der sortiert werden kann. Dazu kannst Du CASE ... WHEN nutzen, z.B. in diesem Fall:

    SELECT  
        *,                  -- SELECT * vermeide ich so gut es geht.  
        sortierung =        -- unsere Hilfsspalte, die für die Sortierung da ist  
        CASE nr  
            WHEN 22 THEN 0  -- erster Arraywert, kleinster Spaltenwert  
            WHEN 12 THEN 1  
            WHEN 3 THEN 2   -- letzter Arraywert, höchster Spaltenwert  
        END  
    FROM CPO_NEWS  
    WHERE nr IN (22, 12, 3)  
    ORDER BY sortierung
    

    liefert im Falle von Transact-SQL, dem SQL-Dialekt des MS SQL-Server das
    von Dir gewünschte Resultat. Gegebenenfalls müsstest Du es an den Dialekt,
    den Dein Datenbankmanagementsystem (DBMS) versteht, anpassen.

    Du solltest jedenfalls sehen, dass Du auch die CASE-Anweisung bequem mittels implode zusammenbauen kannst.

    Freundliche Grüße

    Vinzenz