Markus: sql - die drei größten spaltensummen

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

  1. '001' => 14
    '002' => 88
    dort heißt es im array plötzlich nicht mehr

    '100' => 22
    sondern

    100 => 22

    Hallo Martin

    ich kenne mich mit PHP nicht aus, aber ist es möglich,
    daß Dein Array bei '99' aufhört ?

    Gruß Karina

    1. 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
      sondern

      100 => 22

      Hallo Martin

      ich kenne mich mit PHP nicht aus, aber ist es möglich,
      daß Dein Array bei '99' aufhört ?

      Gruß Karina

  2. 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

    1. 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

  3. 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

    1. 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

      1. 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

        --
        ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
        1. 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