Hi!
meine Frage: kann ich in den ORDER BY-Teil eine Mysql-Variable packen ?
SELECT @myOrder := orderstring
FROM tabelle WHERE id=1;
SELECT * FROM tabelle ORDER BY @myOrder;
> Ausgeführt wird es (ohne Fehler), nur das Ergebnis stimmt leider nicht...
Die Antwort auf die obige Frage lautet also: ja. Allein, es erfüllt nicht den von dir vorgesehenen Zweck. Ausgewertet wird der Variableninhalt, welcher einen String oder eine Zahl ergibt. Bei einem ORDER BY 'string' ist 'string' das Sortierkriterium und dieser String ist ein fester Wert, also bei allen Datensätzen gleich. Einen Feldnamen mit `` als solchen gekennzeichnet in die Variable zu packen bringt es auch nicht, weil dann der Wert '`feld`' immer noch ein String ist, und die beiden `` ein Bestandteil davon sind.
Außer Feldnamen kann man einem ORDER BY auch noch die Position in der Ergebnismenge als Integerwert übergeben.
SELECT a, b, c FROM foo ORDER BY 2
sortiert nach b. Aber abgesehen davon, dass du keine Zahlen in deiner `tabelle` stehen haben wirst und also den Wert erst in eine Spaltenposition umformen müsstest, mag MySQL (5.0) das auch nicht.
SET @test := 1;
SELECT \* FROM tabelle ORDER BY @test;
Auch hier wird wohl der Inhalt von test als Sortierkriterium, nicht aber als Positionsnummer angesehen.
Wenn sich das Konzept nicht insgesamt ändern lässt, sehe ich als mögliche Lösung nur ein [Prepared Statement](http://dev.mysql.com/doc/refman/5.1/en/prepare.html). Dem PREPARE-Statement kann man einen (zusammengesetzten) String übergeben, den es als Statement interpretiert, das dann ausgeführt werden kann. Diesen Vorgang kann man in einer Stored Procedure kapseln, denn es sind ja eine Handvoll Statements, die dabei insgesamt auszuführen sind. Außerdem ist das auch anfällig gegen SQL-Injection, weil ja ein variabler, eventuell nicht vertrauenswürdiger beziehungsweise kompromittierbarer Wert eingefügt. Da muss also eine Überprüfung auf erlaubte Werte stattfinden. Alternativ kann der ermittelte Spaltenname in `` eingeschlossen werden und im innern befindliche ` durch `` ausgetauscht werden (Notationsregeln siehe: [Schema Object Names](http://dev.mysql.com/doc/refman/5.1/en/identifiers.html)). Das ergibt dann bei einem Missbrauchsversuch entweder einen gültigen aber nicht vorgesehenen Feldnamen oder einen Syntaxfehler (Spalte nicht gefunden). Den Test auf erlaubte Werte kann man so auslegen, dass er im Zweifelsfall auf einen Default-Wert zurückfällt und damit ungefährlich und syntaktisch einwandfrei bleibt.
Lo!