Veröffentlicht 4. Mai 200718 j 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
4. Mai 200718 j 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
4. Mai 200718 j 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".
4. Mai 200718 j 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.
4. Mai 200718 j 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...
4. Mai 200718 j 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
4. Mai 200718 j 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
4. Mai 200718 j 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
4. Mai 200718 j 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
4. Mai 200718 j 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.
4. Mai 200718 j 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
4. Mai 200718 j 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
4. Mai 200718 j 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 ^^
7. Mai 200718 j 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.
7. Mai 200718 j 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
7. Mai 200718 j 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.