paco: Nicht Datensätze sondern leere Felder eines Datensatzes zählen

Hallo,
ich habe folgendes Problem. Ich bekomme es einfach nicht hin in einer SQL-Abfrage die leeren Felder EINES Datensatzes meiner SQL-Tabelle auszulesen.

id | projekt_id | aufgabe_1 | ok_1 | aufgabe_2 | ok_2 | aufgabe_3 | ok_3
 1 | 35         | kaffee    | on   | kuchen    |      | zigarette | on

Ich weiß, dass das Datenbankdesign suboptimal für diese Abfrage ist, aber das kann ich nicht ändern.
Ich möchte jetzt einfach die Aufgabenfelder auslesen und zählen wo was drinsteht (sind auch leere Felder dabei), dann das gleiche mit den ok-Feldern (Checkboxen) und diese gegenüberstellen.

Also quasi "SELECT aufgabe_1, ... aufgabe_3 FROM ... WHERE projekt_id = 35 AND Inhalt != ""

Steh auf dem Schlauch, alles was ich bisher so probiert habe mit COUNT oder mysql_num_rows liefert mir ja immer eine Anzahl von Datensätzen. Würde das aber ungern mit php machen.

Geht das überhaupt mit diesem Datenbankdesign?

Vielen Dank schonmal!

lg,
Paco

MySQL 5.0.67
PHP 5.2.6

  1. Moin!

    id | projekt_id | aufgabe_1 | ok_1 | aufgabe_2 | ok_2 | aufgabe_3 | ok_3
    1 | 35         | kaffee    | on   | kuchen    |      | zigarette | on
    Geht das überhaupt mit diesem Datenbankdesign?

    Jetzt mal ohne mich direkt mit Projektplanung befasst zu haben.

    projekte:
    id | name          | Termin
    35  | Kaffetrinken |2010-30-11 15:00:00

    aufgaben:
    id | name             | projekt_id | termin                | dauer   | begonnen| erledigt
    128| Kaffee kochen    | 35         | 2010-30-11 15:00:00   | 10min   | 0       |0
    129| Kuchen kaufen    | 35         | 2010-30-11 15:00:00   | 20min   | 0       |0
    130| Zigaretten holen | 35         | 2010-30-11 15:00:00   | 05min   | 0       |0
    131| Geld holen       | 35         | 2010-30-11 15:00:00   | 30min   | 0       |0

    abhaengige_aufgaben:
    Aufgabe | ZuvorErledigt |
    129     | 131
    130     | 131

    Die horizontale Anordung ist immer nachteilhaft. Schon weil Du nicht weist, wie viele es werden.
    Abfragen via Join.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Danke,
      aber um das ganze Datenbankdesign zu überarbeiten fehlt mir leider echt die Zeit da hängt zuviel dran, es muß jetzt erstmal so gehen. Nächstes mal besser :-)

  2. Hi,

    Ich weiß, dass das Datenbankdesign suboptimal für diese Abfrage ist, aber das kann ich nicht ändern.

    Können oder wollen ...?

    Ich möchte jetzt einfach die Aufgabenfelder auslesen und zählen wo was drinsteht

    Spalteninhalt mit IF auswerten, 1 für leer, 0 für nicht leer; und das für alle Spalten aufsummieren.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Können oder wollen ...?

      Naja ein bißchen von beidem. Ich müßte wahnsinnig viel ändern und dafür hab ich eigentlich keine Zeit. Es funktioniert soweit alles, ich möchte nur noch eine grafische Darstellung realisieren wieviel Prozent der Aufgaben bereits erledigt wurden. Es gibt immer 10 Aufgabenfelder ob voll oder nicht, völlig undynamisch, aber ausreichend.

      Also z.b 5 von 10 Aufgabenfeldern ausgefüllt, 2 von 10 Häkchen gesetzt
      => 5/2 => 40% erledigt.

      Ist nicht besonders elegant, ich weiß, ginge aber schnell (dachte ich jedenfalls..)

      Spalteninhalt mit IF auswerten, 1 für leer, 0 für nicht leer; und das für alle Spalten aufsummieren.

      Könntest Du mir das etwas genauer erklären? das bekomme ich nicht hin :-(

      MfG ChrisB

      Dankeschön und nochmal sorry für doppelpost ;-)

      1. Hi,

        Können oder wollen ...?

        Naja ein bißchen von beidem. Ich müßte wahnsinnig viel ändern und dafür hab ich eigentlich keine Zeit.

        Und beim nächsten Problem, welches sich mit diesem Datenmodell wirklich nicht mehr umsetzen lässt, ist es dann noch mehr Aufwand, es umzubauen.

        Spalteninhalt mit IF auswerten, 1 für leer, 0 für nicht leer; und das für alle Spalten aufsummieren.

        Könntest Du mir das etwas genauer erklären? das bekomme ich nicht hin :-(

        Erkläre du mit bitte dein Verständnisproblem genauer, und was du bereits versucht hast, nachdem du dich im Handbuch über die Benutzung der genannten Kontrollstruktur informiert hast.

        „Ich bekomme es nicht hin“ hilft uns nicht weiter.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Alle Abfragen a la  SELECT COUNT(*) FROM tabelle WHERE projekt_id = 2 AND aufgabe_1 != "" o.ä liefern mir immer die Anzahl der betroffenen Datensätze. Also 1 oder 0.

          Ich habe prinzipell nicht verstanden wie ich einzelne Elemente des Datensatzes in die Abfragen einbeziehen kann.

          Das mit IF klingt vielversprechend, bzw CASE und WHEN..
          Werde mich da mal ein bißchen einlesen, gibt noch viiiel zu lernen...

          Dankeschön!

      2. Spalteninhalt mit IF auswerten, 1 für leer, 0 für nicht leer; und das für alle Spalten aufsummieren.

        ok, ich bin einen Schritt weiter. Mit

        SELECT * FROM tabelle
        WHERE id = 2
        AND IF(aufgabe_1 != '', 1, 0) = 1

        kann ich schonmal abfragen, ob ein bestimmtes Feld leer ist und bekomme 0 oder 1 zurück.

        Kann ich das Aufsummieren auch in die Abfrage packen, oder muß ich für jede Spalte eine einzelne Abfrage machen?

        So in der Art:

        SELECT * FROM tabelle
        WHERE id = 2
        AND IF(aufgabe_1 != '', 1, 0) = x
        AND IF(aufgabe_2 != '', 1, 0) = x++
        AND IF(aufgabe_3 != '', 1, 0) = x++

        Und wie könnte ich das Ergebnis danach weiterverwenden? Kann ich mir das irgendwie mit RESULT = x zurückgeben lassen?

        Dankeschöön,
        Paco

        1. Hi,

          ok, ich bin einen Schritt weiter. Mit

          SELECT * FROM tabelle
          WHERE id = 2
          AND IF(aufgabe_1 != '', 1, 0) = 1

          kann ich schonmal abfragen, ob ein bestimmtes Feld leer ist und bekomme 0 oder 1 zurück.

          Warum steht das jetzt in der WHERE-Klausel?
          Ich dachte, du wolltest dir die Information als Datum liefern lassen?

          Kann ich das Aufsummieren auch in die Abfrage packen

          Klar.
          http://dev.mysql.com/doc/refman/5.1/en/arithmetic-functions.html

          Und wie könnte ich das Ergebnis danach weiterverwenden?

          In dem du für den kompletten Berechnungsausdruck einen Alias vergibst, unter dem du das Ergebnis dann bei der Auswertung ansprechen kannst.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  3. Im Titel steht "leere Felder zählen". Hier schreibst du leere Felder auslesen.
    Dein SQL selected dann wieder alles mit Inhalt != "" also grad die nicht leeren.
    Bisschen unterschiedlich, um dir helfen zu können ;-)

  4. moin,

    meistens ist das schwierigste den fragenden zu helfen, dass die beschreibung unvollständig ist, so auch in deinem falle. die abfrage selbst wird letzlich trivial sein. dafür brauchen wird aber sinnige beispieldaten und vor allem, welche ausgabe du bei genau deinen beispieldaten haben willst. deine beispieldaten und auch deine beschreibende ausgabe lassen zuviel raum für zweifelhafte interpretationen. du kannst deine sql versuche gerne aufzeigen, das ist aber meistens nicht wirklich erforderlich.

    wie gesagt, geben deine beispiel leider nicht eindeutig hervor, was genau du haben willst. zum beispiel ist es für mich noch offen, ob von mehreren datensätzen aufsummieren willst (zum beispiel alle datensätze mit der gleichen projekt-id) oder ob es immer nur um einen datensatz geht, wo du die nicht leeren aufgaben und ok spalten aufaddieren willst.

    noch ein paar hinweise von mir. mit leer meinst du bestimmt NULL werte und diese werden nicht mit !='' geprüft, sondern mit IS NOT NULL. des weiteren geht dein ansatz dass in der WHERE klausel lösen zu wollen, komplett in die falsche richtung. und zu guter letzt wirst du wohl auch keine IF/CASE verzweigung brauchen, man kann sich höchst wahrscheinlich eine eigenheit der aggregat-funktionen zu nutze machen. aber um dies alles mit gewissheit sagen zu können, liefer bitte sinnvolle beispieldaten mit der gewünschten ergebnismenge, so dass es keinen spielraum mehr für interpretationen gibt. dann bekommst du ohne viel aufwand eine lösung für dein problem per sql.

    Ilja