ISNULL Funktion anwenden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ISNULL Funktion anwenden

    Hallöchen,
    meine Tabelle hat folgende Struktur:
    CREATE TABLE `ergebnisse` ( `sp_id` INT(11) NOT NULL AUTO_INCREMENT, `team_a` VARCHAR(50) NOT NULL DEFAULT '0', `team_b` VARCHAR(50) NOT NULL DEFAULT '0', `erg_1` INT(11) NULL, `erg_2` INT(11) NULL, `spieltag` DATETIME NOT NULL,

    Da in erg_1 UND in erg_2 NULL steht wenn kein Ergebnis,
    möchte ich diesen Inhalt mit der Funktion ISNULL überprüfen.

    Mein nicht funktionierender Ansatz:
    PHP-Code:
    $abfrage "SELECT * 
                FROM ergebnisse
                IF(ISNULL(`erg_1`),'NULLIGER',`erg_1`) 
    Habe das RTFM gelesen und auch andere Bsp-Seiten gesehen,
    aber ich krieg das nicht hin.

    Wäre schön wenn ich Hilfe bekommen könnte.

  • #2
    Ehmm, die Syntax macht so wenig Sinn. IF() muss in einem SELECT, WHERE, etc. Teil verwendet werden.

    Kommentar


    • #3
      Zitat von h3ll Beitrag anzeigen
      Ehmm, die Syntax macht so wenig Sinn. IF() muss in einem SELECT, WHERE, etc. Teil verwendet werden.
      Aber wieso scheint es so dann zu gehen?:

      mysql> SELECT `name` AS 'Name',
      > IF(ISNULL(`birthday`),
      > 'Kein Datum angegeben', `birthday`)
      > AS 'Geburtstag' FROM `members`;
      +---------+----------------------+
      | Name | Geburtstag |
      +---------+----------------------+
      | Philipp | 1979-02-06 |
      | Janna | Kein Datum angegeben |
      +---------+----------------------+

      Quelle: » Teil II: MySQL » Listings » Kapitel 19: Ablaufsteuerung,Funktionen, Strings und Zahlen

      So hatte ich es versucht.

      Kommentar


      • #4
        Dann zeig mal Datenbankstruktur, Testdaten und die richtige, fehlerfreie Abfrage.

        Kommentar


        • #5
          Tabellenstruktur: siehe erster Post.
          Daten in der Tabelle ergebnisse:
          sp_id / team_a / team_b / erg_1 /erg_2 / spieltag
          1 / Karl / Nette / 3 / 0 / 2013-03-19 15:00:00
          2 / Micha / Nette / 2 / 0 / 2013-03-20 00:00:00
          3 / Micha / Karl / 3 / 0 / 2013-03-21 00:00:00
          4 / Nette / Peter / (NULL) / (NULL) / 0000-00-00 00:00:00

          Funktionierende Abfrage:
          PHP-Code:
          $abfrage 'SELECT * 
                      FROM ergebnisse
                      ORDER BY
                      spieltag'

          Ich hoffe das hilft :-)
          Zuletzt geändert von Wasser_Wanderer; 25.03.2013, 21:09. Grund: Fehler in sp_id (2 war doppelt)

          Kommentar


          • #6
            Und wo ist jetzt die Abfrage, die Probleme macht?

            Kommentar


            • #7
              Zitat von h3ll Beitrag anzeigen
              Und wo ist jetzt die Abfrage, die Probleme macht?
              So frage ich die Tabelle zur Zeit ab:
              PHP-Code:
              // mySQL-Abfrage:
              $abfrage 'SELECT * 
                          FROM ergebnisse
                          ORDER BY
                          spieltag'
              ;
              $ergebnis mysql_query($abfrage);

              // Anzahl der Datensätze und Anzahl der Datenfelder bestimmen:
              $anzahl_datensaetze mysql_num_rows($ergebnis);
              $anzahl_felder mysql_num_fields($ergebnis);
               
              // Tabelle beginnen
              echo "<table border = '1'>";
               
              // Erste Zeile
              echo "<tr>";
               
              // Schleife 1: Für jedes Feld wird eine th-Zelle erzeugt und der Name eingesetzt:
              for ($n 0$n $anzahl_felder$n++) {
                  
              $feldname =  mysql_field_name($ergebnis$n);
                  echo 
              "<th>" $feldname "</th>";
                  }
              echo 
              "</tr>";
               
              // Schleife 2: Für jeden Datensatz wird ein foreach durchgeführt:
              while ($datensatz mysql_fetch_assoc($ergebnis)) {
                  
              // Neues ARRAY zur weiter Verarbeitung
                
              $new_array[] = $datensatz;
                
                echo 
              "<tr>";
                  
              // Schleife 2-1: Für jeden Wert des Arrays wird eine Zelle erzeugt und der Wert des Arrays ausgegeben:
                  
              foreach ($datensatz as $key => $value) {
                
                  echo 
              "<td>" $value "</td>";
                        }
                  echo 
              "</tr>";
                  }
              echo 
              "</table>"
              Da nun das Ausgabe TD-Feld leer bleibt (bei NULL in der DB) wollte ich einen String-Platzhalter setzen in der Ausgabe. Zb ein "-" wenn (NULL) in der DB-Tabelle: ergebnisse

              Kommentar


              • #8
                PHP-Code:
                if ($value === null) {
                    echo 
                '-';
                } else {
                    echo 
                $value;

                Kommentar


                • #9
                  Zitat von h3ll Beitrag anzeigen
                  PHP-Code:
                  if ($value === null) {
                      echo 
                  '-';
                  } else {
                      echo 
                  $value;

                  Autsch. Aua.

                  Lieben Dank h3ll
                  (Und ich hampel mir da einen ab im SQL-Query)

                  Kommentar


                  • #10
                    Lässt sich sehrt gut und komfortabel in SQL abbilden, so denn es richtig gemacht wird:
                    Code:
                    [COLOR=#000000][COLOR=#CC0000]SELECT `[/COLOR][/COLOR][COLOR=#000000][COLOR=#CC0000]team_a`
                         , `team_b` 
                         , [/COLOR][/COLOR][COLOR=#000000][COLOR=#CC0000][COLOR=#000000][COLOR=#CC0000]IF(ISNULL(`erg_1`),'NULLIGER_1',`erg_1`)[/COLOR][/COLOR] 
                    [/COLOR][/COLOR][COLOR=#000000][COLOR=#CC0000][COLOR=#000000][COLOR=#CC0000]     , IF(ISNULL(`erg_2`),'NULLIGER_2',`erg_2`)
                         ,[/COLOR][/COLOR] `spieltag` 
                    FROM ergebnisse
                                  [/COLOR][/COLOR]
                    Wichtig ist hier, dass im SELECT ALLE im Ergebnis benötigte Spalten namentlich angegeben werden müssen (wie im deinem zitierten Beispiel, Post #3).

                    Und mit diesem richtig funktionierenden SQL-Statement braucht's in PHP keine umständliche IF-Abfrage mehr weil der 'NULL'_Ersatzwert ja schon in dem Abfragearray enthalten ist.

                    Kommentar


                    • #11
                      Die Frage ist eher, ob ein Teil, der eindeutig zur Ausgabelogik zählt, etwas in einer Datenbankabfrage verloren hat. Also ich würde davon abraten es so zu machen.

                      Kommentar


                      • #12
                        Zitat von h3ll Beitrag anzeigen
                        Die Frage ist eher, ob ein Teil, der eindeutig zur Ausgabelogik zählt, etwas in einer Datenbankabfrage verloren hat. Also ich würde davon abraten es so zu machen.
                        Ich würde ja auch gerne auf NULL in der DB verzichten.
                        Aber wenn ich ein INT-Feld habe und dieses als Standard belegen will, dann geht 0 nicht, da das Spiel nicht stattgefunden hat. Also suchte ich nach einer Alternative mit NULL.

                        Wenn es eine bessere Lösung gibt dann wäre ich für Vorschläge dankbar.

                        Zur Erklärung: Ich hatte alles bisher in txt-Dateien und will es auf DB umstellen.
                        Aber ich fange erst mit SQL an und die Abfrage-Syntax ist mir noch nicht so geläufig.

                        @raiguen:
                        Danke für deinen Tipp. Ich hab es so umgesetzt:
                        SELECT `team_a` , `team_b` , IF(ISNULL(`erg_1`),'NULLIGER_1',`erg_1`) AS `Sp1` , IF(ISNULL(`erg_2`),'NULLIGER_2',`erg_2`) AS `Sp2` , `spieltag` FROM ergebnisse

                        Kommentar


                        • #13
                          Zitat von Wasser_Wanderer Beitrag anzeigen
                          Ich würde ja auch gerne auf NULL in der DB verzichten.
                          Das hab ich nicht gesagt. NULL-Werte können in der Datenhaltung sehr wohl sinnvoll sein. Aber die Datenhaltung hat nichts mit der Ausgabe zu tun. Das sind zwei verschiedene Themen.

                          Wenn du bei "keinem Wert", also NULL-Wert ein bestimmtest Zeichen oder einen Text ausgeben möchtest, ist das Aufgabe der Präsentationsschicht und nicht der Datenhaltungsschicht. Wie gesagt, das hat nichts mit der Datenbank zu tun und somit auch nichts in der Datenbankabfrage verloren.

                          Kommentar


                          • #14
                            Zitat von h3ll Beitrag anzeigen
                            Wie gesagt, das hat nichts mit der Datenbank zu tun und somit auch nichts in der Datenbankabfrage verloren.
                            Das habe ich nicht verstanden. Könntest du mir das bitte mit einfachen Worten beschreiben?

                            Kommentar


                            • #15
                              Eine Anwendung ist (wenn sie korrekt programmiert wurde) in drei Schichten aufgeteilt:

                              1. Präsentationsschicht (HTML-Ausgabe, Formulare, etc.)
                              2. Business-Schicht (das "Hirn" der Anwendung)
                              3. Datenhaltungsschicht (Datenbankabfragen, etc.)

                              Die Präsentationsschicht greift niemals direkt auf die Datenbank zu, sondern geht über Business- und Datenhaltungsschicht. Also die Präsentationsschicht sagt der Business-Schicht "ich möchte diese und diese Daten haben". Die Business-Schicht stellte eine Anfrage an die Datenhaltungsschicht, die letztendlich die Datenbankabfrage macht. Daraufhin geht der weg wieder zurück zur Präsentationsschicht. Die Präsentationsschicht kann jetzt entscheiden, ob sie NULL-Werte einfach nicht ausgibt (also leer lässt) oder ob stattdessen ein Platzhalter eingefügt werden soll. Das hat allerdings nichts mehr mit der Datenbank zu tun. Die ist schon lange fertig und sagt "geht mich nix an, was du mit den Daten machst".

                              Das hat dann unter anderem den Vorteil, dass du auch verschiedene Datenquellen verwenden könntest. zB. eine andere Nicht-SQL-Datenbank, eine Textdatei, eine XML-Datei, ein Webservice, usw. Das kann wiederum der Präsentationsschicht egal sein. Sie hat sich nicht dafür zu interessieren, woher ihre Daten kommen. Eine Präsentationsschicht baut auch keine SQL-Abfragen zusammen, weil ansonsten würde sie ja die zwei unteren Schichten umgehen und direkt eine Abhängigkeit zu einer Datenbank schaffen.

                              Kommentar

                              Lädt...
                              X