MYSQL Spalten Addieren, Tausendertrennzeichen entfernen

DonDemf

Erfahrenes Mitglied
Hallo Leute,

folgendes Problem: ich möchte gerne die Spalte (wert) einer gesamten Tabelle addieren. Die Spalte heißt "wert" und ist als varchar(150) bestimmt. Beispielhafte Werte die dort eingetragen sind, sind: 150.000 , 5.000.000 oder auch 50.000.000


Also momentan Addiere ich alle spalten so:

PHP:
$res = mysql_query('select SUM(wert) as total from fifa_spieler WHERE verein = "'.$userdata["user_team"].'"') or die (mysql_error());
$data = mysql_fetch_object($res);
$mgebuhr = $data->total;

Bei der Ausgabe von $mgebuhr erscheint leider nur: 543.5 Euro

Aber es müssten 543.500.000 Euro sein.

Es legt daran, dass php probleme hat mit den Tausendertrennzeichen zu rechnen. Daher muss ich diese entfernen.

Nun zum eigentlichen Problem:

Bisher habe ich immer nur eine einzelne Zeile benötigt und bearbeitet und die Trennzeichen mit:
PHP:
$mw = str_replace(".","",$spieler->wert);
                $mw2 = (int) $mw;

entfernt und als INT bestimmt, damit ich rechnen kann.

Nun muss ich aber anscheinend PHP sagen, dass bei allen angesprochenen Zeilen die obenen stehende Operation mit der Spalte "wert" durchgeführt werden soll.


Wie kann ich dies bewerkstelligen?
 
SQL:
SELECT SUM(REPLACE(wert, ".", "")) AS total FROM fifa_spieler

So sollte es klappen.

Und wenn es auch Nachkommastellen geben kann, erweitere es so:

SQL:
SUM(REPLACE(Replace(wert, ".", ""), ",", ".")) AS total
 
Zuletzt bearbeitet:
Hallo DonDemf,

am einfachsten (und elegantesten) wäre es, wenn du den Spaltentyp zu (BIG)INT änderst!
Dann brauchst du nicht irgendwelche REPLACE-Funktionen, etc. sonder kannst direkt damit rechnen, wobei das auch noch schneller bei vielen Datensätzen ist!


Nun muss ich aber anscheinend PHP sagen, dass bei allen angesprochenen Zeilen die obenen stehende Operation mit der Spalte "wert" durchgeführt werden soll.
Du müsstest mit PHP alle zurückgegebenen Datensätze durchlaufen und jeweils in einen Integer konvertieren.
 
Da hat ComFreek natürlich mehr als Recht. Denn wenn numerische Werte gespeichert werden, dann sollte es auch ein entsprechender Feld-/Datentyp sein.
 
Ja richtig, aber ich bin da mittlerweile so verzwickt in einem Programm, dass es zu viel Aufwand wäre in jedem Teil alles wieder umändern zu müssen, nur um die Spaltenart zu verändern.
 
Also ich hab ja auch mal klein angefangen und jede Menge Mist zusammenprogrammiert. Aber wenn du einen Tipp von mir haben möchtest: Wenn ich absoluten Mist gebaut habe, hab ich mir NIEMALS einen Gefallen damit getan, einen notwendigen Umbau mit irgendwelchen halbgaren Lösungen zu umgehen.

Was du da gebaut hast, ist mehr als Mist.

Ich würde an deiner Stelle folgendes tun: Kopiere dir mal die entsprechende Tabelle (Sicherheitskopie) und dann ändere einfach mal den Datentyp auf INT. MySql macht ja viel mit. Vielleicht geht die Umstellung leichter als du dachtest.
 
So. Hab mir dein Dings nochmal angesehen.

Ich würde an deiner Stelle folgendermaßen vorgehen: Du fügst deiner Tabelle eine zusätzliche Spalte hinzu. Die nennst du von mir aus: wert_int.

Dann kümmerst du dich um die korrekte Umwandlung der Werte in diese neue Spalte. Das schaffst du mit dieser replace-Funktion. Dann baust du dein Programm schrittweise um, so dass alle Abfragen nur noch auf diese neue Spalte lauten.

Wenn du dann fertig bist, hast du erstens was gelernt und zweitens ist deine Datenbank dann auch einigermaßen sauber - wenigstens was diese Sache betrifft. Ich ahne mal dunkel, dass du diese komische Speicherung mit Tausendertrennzeichen wegen der späteren Ausgabe vorgenommen hast. Darum schaust du dir dann noch die PHP-Funktion number_format() an.

Ich weiß, dass du darauf keinen Bock hast, aber du machst es früher oder später sowieso. Also tu es lieber gleich. Das ist viel besser, als wenn du mit deiner Lösung noch ein paar Tage vor dich hinknortzt.

Viel Spaß dabei :-))
 
Mittlerweile bin ja auch schon so weit, dass ich mit number_format und den richtigen typen der Spalten arbeite. Das projekt, welches ich aufarbeiten musste, ist bereits 6Monate alt oder älter.

Aber vielen Dank für die nette Hilfe ;-)
 
Zurück