Michael: mySQL nur bestimmte nichtleere Reihen auswählen!

Hallo,
ich soll für meine Mutter eine DB programmieren mit der sie ihre Bestellungen besser managen kann. Die Tabelle sieht so aus:

Name |Bestelldatum|Bestellstatus|Ware 1|Ware 2|Ware 3
Test |2009-28-10  |            1|     1|     0|     0
Test2|2009-13-10  |            1|     0|     0|     1

Auf der PHP seite die ich programmiere sollte nun eine Tabelle angezeigt werden die alle obigen Infos BIS AUF "Ware 2" als Spalte anzeigt.

Dazu würde ich gerne nur die Spalten auswählen, bei denen nicht NUR 0 vorkommt. Die "Ware" spalten können locker bis Ware 200 gehen und werden immer erweitert im Lauf der Zeit.

Der jetzige code sieht so aus:

mysql_query('SELECT * FROM bestellungen WHERE bestellstatus <= 1 ORDER BY bestelldatum ASC');

(bestellstatus 0 = bestellt, 1 = in bearbeitung, 2 = fertig)

Ein pseudocode wäre
mysql_query('SELECT everything where value is not 0 FROM bestellungen WHERE bestellstatus <= 1 ORDER BY bestelldatum ASC');

Ich hoffe jemand versteht was ich meine.

Es geht spezifisch darum nur die nicht-leeren Spalten auszuwählen, da der PHP code diverse Längenzählungen benutzt die auf der Zahl der ausgewählten Spalten basieren. Also "einfach alles auswählen und dann leere nicht anzeigen per php" geht nicht.

Ich hoffe jemand kann mir weiterhelfen, danke.

  1. Kontrollierte Ausgabe mit PHP

      
    $sql = mysql_query('SELECT everything where value is not 0 FROM `bestellungen` WHERE bestellstatus <= 1 ORDER BY `bestelldatum` ASC');  
      
    while($row = mysql_fetch_assoc($sql))  
    {  
       foreach($row as $index=>$value)  
       {  
          if(substr($index,0,4) == "Ware" && $value != 0)  
          {  
              echo "$index = $value<br />";  
          }  
       }  
    }  
    
    

    (ungetestet) Damit holst du dir Zeilenweise Einträge aus der DB in ein Array, das Array liest du mit foreach aus und überprüfst mit substr ob die Spalte auch Waren betrifft (was nach Ware kommt ist dann egal). Die zweite bedinung in if überprüft ob diese null ist.

    Ich würde aber das ganze eh anderster Bauen: ich würde eine Tabelle anlegen mit Waren und eine mit bestellungen. Bestellt der Kunde was, würde ich die ID's in die Tabelle bestellungen eintragen:

    Warentabelle:
    +----+------+------+
    | ID | WARE | PREIS|
    +----+------+------+
    |  1 | Buch | 10.00|
    +----+------+------+
    |  2 | CD   | 12.00|
    +----+------+------+

    Bestelltabelle(hab mal deine Tabelle übernommen):
    Name |Bestelldatum|Bestellstatus|Ware  | Anzahl|
    Test |2009-28-10  |            1|     1|      1|      // Bestellt 1 Buch
    Test2|2009-13-10  |            1|     2|      2|      // Bestellt 1 CD
    Test3|2009-13-10  |            1|   1,2|    2,1|      // Bestellt 2 Bücher + 1 CD

    MFG

    Me

    1. Hi!

      Ich würde aber das ganze eh anderster Bauen: ich würde eine Tabelle anlegen mit Waren und eine mit bestellungen. Bestellt der Kunde was, würde ich die ID's in die Tabelle bestellungen eintragen:

      Erleichterung.

      Warentabelle:
      +----+------+------+
      | ID | WARE | PREIS|
      +----+------+------+
      |  1 | Buch | 10.00|
      +----+------+------+
      |  2 | CD   | 12.00|
      +----+------+------+

      Schoen.

      Bestelltabelle(hab mal deine Tabelle übernommen):
      Name |Bestelldatum|Bestellstatus|Ware  | Anzahl|
      Test |2009-28-10  |            1|     1|      1|      // Bestellt 1 Buch
      Test2|2009-13-10  |            1|     2|      2|      // Bestellt 1 CD
      Test3|2009-13-10  |            1|   1,2|    2,1|      // Bestellt 2 Bücher + 1 CD

      Herzanfall.

      Was soll das denn? Lest euch alle beide doch bitte mal durch, was Normalisierung ist.

      Name |Bestelldatum|Bestellstatus|Ware  | Anzahl|
      Test |2009-28-10  |            1|     1|      1|      // Bestellt 1 Buch
      Test2|2009-13-10  |            1|     2|      2|      // Bestellt 1 CD
      Test3|2009-13-10  |            1|     1|      2|      // Bestellt 2 Bücher
      Test3|2009-13-10  |            1|     2|      1|      // und 1 CD

      Wobei es durchaus Sinn macht, den Bestellungen IDs zu geben. Die Tabelle ist sogar noch weiter aufloesbar:
      Tabelle Bestellungen
      ID  | Name  | Datum      | Status
      231 | Test  | 2009-10-01 | 0
      986 | Test2 | 2009-09-31 | 1

      Tabelle Bestellte Waren
      BestellID | WarenID | Anzahl
      231       | 1       | 2
      231       | 2       | 1
      986       | 1       | 27

      Das ist Durchaus eine Aufgabe die dem DBMS ueberlassen werden sollte. Eine vernuenftige Strukturierung vorausgesetzt.

      --
      "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
            - T. Pratchett
      1. Bestelltabelle(hab mal deine Tabelle übernommen):
        Name |Bestelldatum|Bestellstatus|Ware  | Anzahl|
        Test |2009-28-10  |            1|     1|      1|      // Bestellt 1 Buch
        Test2|2009-13-10  |            1|     2|      2|      // Bestellt 1 CD
        Test3|2009-13-10  |            1|   1,2|    2,1|      // Bestellt 2 Bücher + 1 CD

        Herzanfall.
        Was soll das denn? Lest euch alle beide doch bitte mal durch, was Normalisierung ist.

        kann man einfach mit explode(",",$var); wieder auslesen.

        Tabelle Bestellungen
        ID  | Name  | Datum      | Status
        231 | Test  | 2009-10-01 | 0
        986 | Test2 | 2009-09-31 | 1

        Tabelle Bestellte Waren
        BestellID | WarenID | Anzahl
        231       | 1       | 2
        231       | 2       | 1
        986       | 1       | 27

        Klar kann man auch so lösen. Nur ich habe meine ID's gerne Fortlaufend einmal vergeben, auch wenn es sich hier wohl mehr um eine AuftragsNummer handelt.

        MFG

        Me

        1. Mahlzeit Me,

          kann man einfach mit explode(",",$var); wieder auslesen.

          Es geht nicht ums Auslesen, sondern um vernünftige Durchsuch- und Sortierbarkeit usw. ... wie gesagt: informiere Dich zunächst zum Thema Normalisierung. Gründlich. Vorher haben Diskussionen über angebliche Vorteile eines definitiv kaputten Konzepts keinen Sinn.

          Klar kann man auch so lösen. Nur ich habe meine ID's gerne Fortlaufend einmal vergeben, auch wenn es sich hier wohl mehr um eine AuftragsNummer handelt.

          Rein technische IDs sollten keinerlei weitere Informationen/Eigenschaften haben außer eine eindeutige Identifizierbarkeit des jeweiligen Datensatz zu ermöglichen.

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Mahlzeit Michael,

    Die "Ware" spalten können locker bis Ware 200 gehen und werden immer erweitert im Lauf der Zeit.

    Das Design der Tabelle ist defekt - repariere das. Informiere Dich dazu am besten zum Thema Normalisierung.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|