Zum Inhalt springen

Sortierproblem... Wie würdet ihr das lösen?


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...