sql - die drei größten spaltensummen
Markus
- datenbank
0 Karina Gallehr0 Sacha0 Markus
0 Olaf Schneider0 Markus
hallo!
ich habe ein problem und komme nicht dahinter...
ich habe eine mysql-tabelle mit 150 spalten...
spaltennamen 001 bis 150
insgesamt gibt es 200 zeilen...
nun möchte ich gerne die 3 größten spaltensummen auslesen und finde dazu einfach keinen sql-befehl...
also habe ich eine foreach-schleife gemacht, die immer die summe eine spalte liest und diese in ein php-array packt:
beispiel:
'001' => 14
'002' => 88
usw...
aber bei 100 entsteht ein fehler...
dort heißt es im array plötzlich nicht mehr
'100' => 22
sondern
100 => 22
...
warum?
gruß
markus
'001' => 14
'002' => 88
dort heißt es im array plötzlich nicht mehr'100' => 22
sondern100 => 22
Hallo Martin
ich kenne mich mit PHP nicht aus, aber ist es möglich,
daß Dein Array bei '99' aufhört ?
Gruß Karina
hallo!
nein, ich gebe den array mit var_dump aus und er zeigt ihn bis 099 in einfachen anführungszeichen (') und ab 100 macht er es nicht mehr.
ich kann also die ersten 100 (0-99) per assoziation aufrufen, die folgenden sieht er dann als indexierung, weil dort ja steht $array[100]
gruß
markus
'001' => 14
'002' => 88
dort heißt es im array plötzlich nicht mehr'100' => 22
sondern100 => 22
Hallo Martin
ich kenne mich mit PHP nicht aus, aber ist es möglich,
daß Dein Array bei '99' aufhört ?Gruß Karina
Hallo Markus
Warum benennst du den Array denn mit assoziativen Werten? Füge den neuen Wert doch einfach so ein:
$array[] = 14;
Dann musst du zwar am Ende beachten, dass der erste Wert den Index 0 und der letzte 199 hat, aber du wirst dafür bestimmt keine Probleme mit dem 100. Eintrag haben.
Sollte das nicht klappen, kannst du ja mal ein Stück Quellcode posten. Vielleicht hilft uns das weiter! ;-)
Gruss
Sacha
hallo!
die keys meines arrays sind die namen der spalten in der datenbank und die brauche ich zur weiteren verwendung...
gruß
markus
Hallo Markus
Warum benennst du den Array denn mit assoziativen Werten? Füge den neuen Wert doch einfach so ein:
$array[] = 14;
Dann musst du zwar am Ende beachten, dass der erste Wert den Index 0 und der letzte 199 hat, aber du wirst dafür bestimmt keine Probleme mit dem 100. Eintrag haben.
Sollte das nicht klappen, kannst du ja mal ein Stück Quellcode posten. Vielleicht hilft uns das weiter! ;-)
Gruss
Sacha
Hi Markus,
ich würde die MySQL-Tabelle anders anlegen:
+----+---------------+------+
| id | spaltennummer | wert |
+----+---------------+------+
damit bist Du wesentlich flexibler und hast auch keine Probleme, wenn statt 150 plötzlich 500 Spalten verlangt werden. Bei Deiner jetzigen Tabelle hättest Du dann 150x200 = 30000 Zeilen. Das stellt für Datenbanken aber überhaupt kein Problem dar. Bei Deinem jetzigen Datenmodell mußt Du alles vom PHP-Code errechnen lassen und damit auch 150 SQL-Anfragen anstatt einer stellen.
Gruss Olaf
hi olaf,
also die tabelle sieht so aus
+----+-----+-----+-----+ ... +-----+
| id | id2 | 001 | 002 | | 150 |
+----+-----+-----+-----+ ... +-----+
die 150 ist nur ein beispiel, sie kann auch später erweitert werden, das ändert nicht viel an der abfrage...
die anzahl der zeilen ist auch variabel...
ich habe bei meiner zuerst erwähnten vorgehensweise nachgesehen, welche spalten die tabelle hat, habe dann die ersten beiden spalten rausgenommen aus dem ergebnis und den rest mit einer foreach durchlaufen
SELECT SUM(001
) FROM table;
SELECT SUM(002
) FROM table;
...
SELECT SUM(150
) FROM table;
und in einen array gepackt...
aber das geht bestimmt direkt über einen langen sql-befehl, der mir nicht in den sinn kommt und zum zweiten entsteht bei dem array ab der zahl 100 ein seltsames phänomen, wie ich es bereits beschreiben hatte!
gruß
markus
Hi Markus,
ich würde die MySQL-Tabelle anders anlegen:
+----+---------------+------+
| id | spaltennummer | wert |
+----+---------------+------+damit bist Du wesentlich flexibler und hast auch keine Probleme, wenn statt 150 plötzlich 500 Spalten verlangt werden. Bei Deiner jetzigen Tabelle hättest Du dann 150x200 = 30000 Zeilen. Das stellt für Datenbanken aber überhaupt kein Problem dar. Bei Deinem jetzigen Datenmodell mußt Du alles vom PHP-Code errechnen lassen und damit auch 150 SQL-Anfragen anstatt einer stellen.
Gruss Olaf
Moin!
also die tabelle sieht so aus
+----+-----+-----+-----+ ... +-----+
| id | id2 | 001 | 002 | | 150 |
+----+-----+-----+-----+ ... +-----+
Wir wissen, wie die Tabelle aussieht...
die 150 ist nur ein beispiel, sie kann auch später erweitert werden, das ändert nicht viel an der abfrage...
...aber genau das ist dein Problem. Du willst eine dynamische Information (die Numerierung der Spalten, die nicht fix ist) in einem Bereich ablegen, der nur für statische Informationen geeignet ist, nämlich in den Spaltennamen. Das geht irgendwie mit Sicherheit schief.
die anzahl der zeilen ist auch variabel...
Davon muß man bei einer Datenbank ausgehen... :)
ich habe bei meiner zuerst erwähnten vorgehensweise nachgesehen, welche spalten die tabelle hat, habe dann die ersten beiden spalten rausgenommen aus dem ergebnis und den rest mit einer foreach durchlaufen
SELECT SUM(
001
) FROM table;
SELECT SUM(002
) FROM table;
...
SELECT SUM(150
) FROM table;und in einen array gepackt...
Bäh, eklig!
aber das geht bestimmt direkt über einen langen sql-befehl, der mir nicht in den sinn kommt und zum zweiten entsteht bei dem array ab der zahl 100 ein seltsames phänomen, wie ich es bereits beschreiben hatte!
Mit der richtigen Tabellenstruktur geht das sogar mit einem kurzen SQL-Befehl:
SELECT spaltennummer, sum(wert) as summe FROM tabelle GROUP BY spaltennummer ORDER BY summe DESC LIMIT 3
Und schwups rechnet dir die Datenbank die größten drei Spaltensummen aus und teilt dir auch noch gleich die Spaltennummer mit.
Vorausgesetzt, du änderst (jetzt, einmalig, anstatt später andauernd) deine Tabelle so, wie Olaf vorgeschlagen hat:
ich würde die MySQL-Tabelle anders anlegen:
»»
+----+---------------+------+
| id | spaltennummer | wert |
+----+---------------+------+
- Sven Rautenberg
also, ich verstehe nicht, wie ihr das meint:
so bei mir:
+----+-----+-----+-----+ ... +-----+
| id | id2 | 001 | 002 | | 150 |
+----+-----+-----+-----+ ... +-----+
+----+-----+-----+-----+ ... +-----+
| 01 | 452 | 4 | 7 | ... | 12 |
+----+-----+-----+-----+ +-----+
| 02 | 452 | 234 | 840 | ... | 100 |
+----+-----+-----+-----+ +-----+
| 03 | 678 | 16 | 36 | ... | 123 |
+----+-----+-----+-----+ +-----+
und wo packe ich in eurem vorschlag nun die zeilen hin?
stehe ich auf dem schlauch? ;-)
gruß
markus