Eupinkepank Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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 Zitieren
johnhaltonx Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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 Zitieren
Eupinkepank Geschrieben 4. Mai 2007 Autor Geschrieben 4. Mai 2007 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". Zitieren
DevilDawn Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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. Zitieren
Eupinkepank Geschrieben 4. Mai 2007 Autor Geschrieben 4. Mai 2007 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... Zitieren
Reinhold Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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 Zitieren
geloescht_JesterDay Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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 Zitieren
Reinhold Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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 Zitieren
Reinhold Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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 Zitieren
geloescht_JesterDay Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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. Zitieren
Reinhold Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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 Zitieren
geloescht_JesterDay Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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 Zitieren
BugBite Geschrieben 4. Mai 2007 Geschrieben 4. Mai 2007 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 ^^ Zitieren
Eupinkepank Geschrieben 7. Mai 2007 Autor Geschrieben 7. Mai 2007 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. Zitieren
johnhaltonx Geschrieben 7. Mai 2007 Geschrieben 7. Mai 2007 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 Zitieren
Eupinkepank Geschrieben 7. Mai 2007 Autor Geschrieben 7. Mai 2007 Nunja... Oracle nutze ich nicht.... Lediglich MySQL und PG SQL in beiden funzt das prima. Trotzdem Danke an alle... Zitieren
Empfohlene Beiträge
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.