Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Ich bekomme aus einem XML Dokument eine Anzahl von Datensatz IDs geliefert.

Diese IDs stimmen mit den IDs in meiner DB überein.

Beispiel:

3,9,12,34,1,74,188

Nun mache ich halt die Abfrage an die DB um mir diese Datensätze anzeigen zu lassen.

Das ganze ist noch im Entwicklungsstadium, also sieht das so aus:


SELECT irgendwas FROM tabelle WHERE (id=3 OR id=9 OR id=12 OR id=34 OR id=1 OR id=74 OR id=188)
[/PHP]

Klappt auch prima....

Allerdings kommt nun natürlich die id 1 vor der id 3 usw. im Ergebnis.

Wie würdet ihr MySQL "beauftragen" exakt die Reihenfolge einzuhalten, die ich vom XML bekommen habe?

Ich habe da zwar eine Lösung, die ist jedoch nicht sehr performant so dass ich sie gar nicht zu posten wage :D

Geschrieben

erstmal würde ich bei so ner Anzahl an Abfragewerten eine IN list verwenden

und das sortieren über order by feldname asc/desc erledigen

SELECT irgendwas

FROM tabelle

WHERE id in (3,6,13,23,244 .... etc)

order by id asc/desc

Geschrieben

Wenn ich mich recht entsinne ist die Ausgabe von SQL ohne "SORT BY" per definition nicht Vorhersagbar.

Du wirst die Ergebnisse also manuell in deine Reihenfolge bringen müssen. Oder Einzelqueries absetzen.

Geschrieben

Bislang habe ich das so gelöst:


SELECT irgendwas FROM tabelle WHERE (id=3 OR id=9 OR id=12 OR id=34 OR id=1 OR id=74 OR id=188) ORDER BY id=3 DESC, id=9 DESC, id=12 DESC, id=34 DESC, id=1 DESC, id=74 DESC, id=188 DESC
[/PHP]

Das klappt zwar, sieht aber irgendwie blöde aus...

Geschrieben

Ich nehme einfach mal an, dass du das SQL-Statement dynamisch erzeugst. Dann sollte prinzipiell das hier klappen:


select 1, Irgendwas from tabelle where id = 3

union

select 2, Irgendwas from tabelle where id = 9

union

select 3, Irgendwas from tabelle where id = 12

union

select 4, Irgendwas from tabelle where id = 34

union

select 5, Irgendwas from tabelle where id = 1

union

select 6, Irgendwas from tabelle where id = 74

union

select 7, Irgendwas from tabelle where id = 188


order by 1;

Bei MySql kann das aber schief gehen.

Reinhold

Geschrieben

Bei MySql kann das aber schief gehen.

Wieso denn? Wenn es aber schiefgehen sollte, gib der Spalte 1 doch einen Namen, nach dem du sortieren kannst dann:


select 1 bla, Irgendwas from tabelle where id = 3

union

select 2 bla, Irgendwas from tabelle where id = 9

union

...

oder by bla

Aber ein Union hängt die Results eh hintereinander. Das geht also auch ohne ein Order by ;)

Geschrieben

Wieso denn? Wenn es aber schiefgehen sollte, gib der Spalte 1 doch einen Namen, nach dem du sortieren kannst dann:

Das hat mit dem Namen nichts zu tun, sondern ich meinte das, weil ältere MySql-Versionen (bis 3.23?) mit UNION nichts anfangen können.

Aber ein Union hängt die Results eh hintereinander. Das geht also auch ohne ein Order by ;)

Mindestens bei MS-SQL-Server wird im Zweifelsfall nach dem Primärschlüssel sortiert. Jedenfalls sah das eben so aus, als ich ganz gegen meine Gewohnheit das ganze mal probiert habe.

Reinhold

Geschrieben

Konkret:


select ID, anlagennr from anlagen where ID= 8000

UNION

select ID, anlagennr from anlagen where ID= 5000

UNION

select ID, anlagennr from anlagen where ID= 6000

UNION

select ID, anlagennr from anlagen where ID= 7000

;

führt zu

5000	157

6000	1157

7000	2160

8000	3163

im Queryanalyzer von SQLServer 2000

Reinhold

Geschrieben

Auch liefert MySQL eine nicht weiter sortiertes Ergebnis bei union. Aber sauberer ist es wohl mit order by.

Ja, ja, die kleinen Unterschiede ....

Womit wir beide wohl am Ende der Diskussion wären, weil Eupinkepank nicht verrät, welches DBMS verwendet wird.

Schönes Wochenende aus dem sonnigen Norden (und mit dem mir eigenen sonnigen Gemüt)

Reinhold

Geschrieben

Hallo,

wie wärs denn wenn du deine xml daten in ein array füllst und danach jedes element EINZELN mit for each aus der datenbank abfragst...

dadurch sparst du dir auch das lästige OR

du kannst dann natürlich auch direkt in der for each ein array mit den abfrage ergbebnissen füllen :]

die reihenfolge bleibt somit auch erhalten ^^

Geschrieben

Hi!

Eure Antworten sind zwar alle nett gemeint und auch gute Ansätze, sie sind aber alle nicht sehr performant.

Also werde ich es bei meiner Lösung belassen, auch wenn es mir etwas "komisch" erscheint.

Die vielen "OR" werden natürlich nach dem Test in ein "IN()" getauscht.

Geschrieben

Die Vorgabe die IDs in einer bestimmten reihnefolge haben zu wollen ist einfach nicht sehr performant ....^^

Lösung die mir jetzt noch einfallen würde

Beim laden jedem datensatz aus dem xml ne monoton steigende zusätzliche id verpassen und danach sortieren ...

Wie mysql das macht weiss ich nicht aber die query


SELECT irgendwas FROM tabelle WHERE (id=3 OR id=9 OR id=12 OR id=34 OR id=1 OR id=74 OR id=188)  ORDER BY id=3 DESC, id=9 DESC, id=12 DESC, id=34 DESC, id=1 DESC, id=74  DESC, id=188 DESC 

geht zumindest in Oracle nicht

da geht das "order by id=xy" nicht

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...