Seite 1 von 1

Textfeld in Abfrage umwandeln zu Zahlenfeld

Verfasst: So 17.Jun, 2007 22:45
von cbrkiter
Servus. Ich habe mal ein Problem.

Ich habe folgende Abfrage innerhalb eines php-Scripts:

Code: Alles auswählen

$sql = "SELECT *
	FROM " . TABLE1 . "
	ORDER BY FeldX DESC";
Das Feld replacement wurde wie folgt in der DB bzw. Tabelle angelegt

Code: Alles auswählen

FeldX char(100) NOT NULL default ''
Jetzt stehen aber nur Zahlenwerte in dem Feld und wenn ich mir das Ergebnis zeilenweise ausgeben lasse, dann habe ich die Reihenfolge Zeile 1 = 9253 / Zeile 2 = 9 und Zeile 3 = 881 usw.

Kann ich bereits in der SQL-Abfrage das Feld FeldX in ein Zahlenfeld umwandeln, so dass auch die Sortierung später richtig ist?


PS: Ich hoffe, ich habe das richtige Forum erwischt. Falls nicht, dann verschiebt es bitte dorthin, wo es hingehört. ;)

Verfasst: Mo 18.Jun, 2007 00:08
von oxpus
Öhm, rechne doch einfach damit.
PHP erkennt dann schon, was Du willst.
Grund: Variablen werden ohne vorherige Definition nach dem Inhalt definiert.
Daher kann man mit aus einer Datenbank ausgelesenen "Texten" rechnen, sofern diese Zahlen sind.
Um sicher zu gehen, daß dem aber wirklich so ist, kannst Du mit

Code: Alles auswählen

$variable = intval($variable);
diese in eine definitive Zahl umwandeln.
Kann PHP dabei keine Zahl entdecken (also der Inhalt beginnend mit Ziffern), wird "FALSE" zurückgegeben, also "0". Andernfalls schneidet PHP alles nach der letzten erkannten Ziffer einfach ab.
So wird z. B. aus
"dies ist keine Zahl" = FALSE
"123 ist eine Zahl" = 123
"die Zahl 123 ist nicht lesbar" = FALSE
"123" = 123
123 = 123 (ein bisschen blöd dieses Beispiel, aber es würde z. B. 12,3 zu einer 12 umgewandelt, da PHP von Hause aus nur den Punkt als Dezimaltrenner kennt (englisches Format)!)

Verfasst: Mo 18.Jun, 2007 00:17
von cbrkiter
Naja, dass PHP normalerweise die Typen erkennt, weiß ich ja. Aber in diesem Fall will ich ja lediglich die Datensätze nacheinander ausgeben lassen. Die Sortierung sollte ja schon durch die SQL-Abfrage erfolgen und nicht nochmal durch Umsortierung in PHP. Daher war meine Hoffnung, es gäbe etwas wie

Code: Alles auswählen

SELECT NUMERIC(FeldX) AS y, * 
  FROM TABLE1 
  ORDER BY y DESC;
Weiß Du, wie ich das meine? Ich weiß halt nur nichts für NUMERIC().

//EDIT
Also NUMERIC wirds garantiert nicht sein. Es müsste wohl ein Datentyp wie FLOAT oder INT sein.

Verfasst: Mo 18.Jun, 2007 01:07
von oxpus
Dann wandele doch das Feld in einen Integer oder Long Integer Wert um. Dabei geht in der Regel kein Inhalt verloren (Backup ist aber bei sowas IMMER Pflicht!) und die Sortierung klappt dann nach Zahlen, wie man das gewohnt ist.
Alles andere würde an dieser Stelle nur unnötig Zeit kosten, da ja jeder Wert von String in Numerischen Werten erst konvertiert werden muss, um dann erst sortiert werden zu können.
Zumal ja nach Deiner Aussage eh nur Zahlen in dem Feld enthalten sind...

Verfasst: Mo 18.Jun, 2007 01:21
von cbrkiter
Jo, da das ursprüngliche Script ja nur einen Zähler in dem Feld speichert, gehe ich mal stark davon aus, das dort nur Zahlen enthalten sind. Das Script addiert auch immer nur 1 hinzu und fertig. Sinn und Zweck eines Zählers halt. ;)

Nagut, es wird wohl das einfachste sein. Danke Dir.


// EDIT

Hab nach langem googlen doch noch eine Lösung gefunden, die für mein Probelm als Vorlage herhalten konnte. So funktioniert es jetzt:

Code: Alles auswählen

SELECT *
	FROM TABLE1
	ORDER BY CAST(feldX AS SIGNED) DESC;
Ich dachte, ich schreib's mal noch hierher, falls es mal jemand gebrauchen könnte ;)