SQL Abfrage sortieren
Stefan
- php
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
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.
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
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