Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

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

Du hast leider meine Frage nicht begriffen ;)

Ich will weder ASC, noch DESC sortieren, sondern die Ausgebe in der Reihenfolge haben, wie sie im XML steht ... also quasi "durcheinander".

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.

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

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

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

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

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

Also bei MySQL ging das, mit Version 3 hab ich das allerdings nicht probiert.

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

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

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

Glaube du bist schon von der Sonne geblendet ;)

Wie würdet ihr MySQL "beauftragen" ...

Dir auch ein weiterhin schönes WE :D

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

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.

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

Nunja...

Oracle nutze ich nicht....

Lediglich MySQL und PG SQL

in beiden funzt das prima.

Trotzdem Danke an alle...

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.