[SQL allgemein] Wenn kein DS, dann anderen DS ?

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

  • [SQL allgemein] Wenn kein DS, dann anderen DS ?

    Hi,
    kann ich in einer Query erreichen,
    dass ich z.B. einen DS mit einer spezifischen id suche,
    und falls dieser DS zwar vorhanden, aber keinen Inhalt besitzt (Leer),
    dass dann ein anderer DS gelesen und ausgegeben wird?

    Danke

  • #2
    Hier mein Beispiel:

    PHP-Code:
    SELECT        u_s.setting,
                                                    
    u_s.value
                                            FROM    user_setting u_s
    ,
                                                    
    user u
                                            WHERE    setting 
    "alter"
                                            
    AND     u.id '17'
                                            
    AND        alteru_s.id 
    Nun, wenn das Ergebnis Leer bleibt, weil in der Zelle des Datensatzen kein Wert verfügbar ist (NULL), dann soll eine andere Query ausgeführt werden, welche z.B. einen Datensatz ausließt.

    Wie kann ich das mit einer IF realisieren?

    (Sry für das besch..eidene Einrücken
    Zuletzt geändert von phpMorpheus2; 17.02.2009, 09:18.

    Kommentar


    • #3
      PHP-Code:
      <?php
      $result 
      mysql_query("SELECT bla FROM tabelle WHERE id = 5 AND bla IS NOT NULL");
      if (
      mysql_num_rows($result) == 0) {
        
      $result mysql_query("SELECT blubb FROM tabelle2 WHERE id = 5");
      }

      if (
      mysql_num_rows($result)) {
        
      print_r(mysql_fetch_assoc());
      }
      Vielleicht solltest du aber mal deinen Anwendungsfall etwas genauer erläutern... irgendwie rieche ich nämlich förmlich, dass du irgendwas sehr merkwürdig modelliert hast.

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        Alternativen Datensatz via JOIN mit selektieren und dann IFNULL()

        Code:
        SELECT IFNULL(t1.value, t2.value)
          FROM table1
         INNER JOIN table2
            ON table1.cond = table2.cond
        carpe noctem

        [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
        [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

        Kommentar


        • #5
          Original geschrieben von ghostgambler
          PHP-Code:
          <?php
          $result 
          mysql_query("SELECT bla FROM tabelle WHERE id = 5 AND bla IS NOT NULL");
          if (
          mysql_num_rows($result) == 0) {
            
          $result mysql_query("SELECT blubb FROM tabelle2 WHERE id = 5");
          }

          if (
          mysql_num_rows($result)) {
            
          print_r(mysql_fetch_assoc());
          }
          Vielleicht solltest du aber mal deinen Anwendungsfall etwas genauer erläutern... irgendwie rieche ich nämlich förmlich, dass du irgendwas sehr merkwürdig modelliert hast.
          Nungut, es war nur ein Beispiel.
          Ich möchte eben umgehen, zwei abfragen erstellen zu müssen.
          z.B. eine Abfrage in der gefragt wird, ob die Abfrage erfolgreich war und falls nicht, eine andere query abfragen aber alles in einer SQL_Query

          Kommentar


          • #6
            Also man könnte natürlich sowas machen:

            SELECT col
            FROM table
            WHERE id in($id,$alternative_id)
            AND col is not null
            LIMIT 1

            Dann wird der Datensatz mit id=$id als erstes geprüft, der mit $alternative_id als nächstes
            Beantworte nie Threads mit mehr als 15 followups...
            Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

            Kommentar


            • #7
              PHP-Code:
              SELECT col1col2col3
              FROM Tbl
              WHERE col1 
              '1'
              AND col2 'haus'
              AND col3 manfred 
              IST jedoch die Abfrage dann leer, trotz das alle Bedingungen erfüllt worden sind (Denn trotz erfüllten bedingungen KANN der Datensatz leer sein!) dann möchte ich in der selben Query die WHERE Bedingung ändern !

              z.B. so:
              PHP-Code:
              SELECT col1col2col3
              FROM Tbl
              WHERE
              IF(col1 '1'
              AND col2 'haus'
              AND col3 manfred) AS Bedingung1 NULL
              THEN
              col1 
              '2'
              AND col2 'boot'
              AND col3 beate) AS Bedingung2
              ELSE
              //Bedingung1 bleibt als Ergebnis zurück, es sei denn,
              //Bedingung1 ist Leer und dann ist Bedingung2 das Ergebnis 

              Kommentar


              • #8
                Dann ändere deine WHERE-Bedingung so ab, dass nur etwas zurück geliefert wird, wenn auch der Wert in der Spalte der gewünschte Wert ist.

                Ein anderer Weg zum Self-Join wäre noch
                WHERE (bedingung1) OR (bedingung2) ORDER BY bedingung1 DESC
                und dem würde ich prinzipiell auf den Vorzug gewähren... sieht zwar komisch aus, braucht dafür keinen JOIN.

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar


                • #9
                  Ja, jetzt habe ich es mit einer CASE auswahl hinbekommen.
                  Jedoch ein kleines Problem noch.
                  Und zwar bekomme ich als Ergebnis immer 2 Zellen.
                  Bei der ersten Auswahl werden beide gefüllt, bei der zweiten aber nicht.
                  Dort fehlt der Inhalt der ersten Zelle und ich weiß nicht wie ich diese füllen kann mit meinem Inhalt weil die Abfrage sich in der WHERE klausel befindet.

                  Das Alter wird zwar angezeigt, aber nicht die Zelle "Settings".
                  Diese Zelle wird nicht mit dem Wort "alter" gefüllt.

                  PHP-Code:
                  SELECT    u_s.setting,
                                  
                  u_s.value
                  FROM        user_setting u_s
                  ,
                                  
                  user u
                  WHERE        
                  CASE WHEN
                                  u
                  .id 22
                                  
                  AND u.alter 0
                  THEN        
                  (u_s.setting "alter"
                                  
                  AND            u.id 22
                                  
                  AND            u.alter u_s.id)
                  ELSE        (
                  u.id 22
                                  
                  AND            u_s.id 0
                                  
                  AND            u.alter u_s.id)
                  END 

                  Kommentar


                  • #10
                    ja weils im sql zugeordnet wird
                    THEN (u_s.setting = "alter"


                    was hat denn hieran:

                    SELECT col
                    FROM table
                    WHERE id in($id,$alternative_id)
                    AND col is not null
                    LIMIT 1

                    nicht funktioniert? Oder was war falsch verstanden?
                    Beantworte nie Threads mit mehr als 15 followups...
                    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                    Kommentar


                    • #11
                      Tendenziell wäre es immer noch interessant den Anwendungsfall mal beschrieben zu kriegen.
                      Mir dünkt als wäre hier eine Normalform verletzt.
                      Das Problem kann man dann garantiert auch schöner lösen!
                      Zuletzt geändert von ghostgambler; 20.02.2009, 12:31.

                      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                      Wie man Fragen richtig stellt

                      Kommentar


                      • #12
                        Ok nähere Beschreibung:
                        Tabelle:
                        user
                        +--id--+--color--+--age--+
                        |--17--|----23----|---21---|


                        user_setting
                        +--id--+--setting--+--value--+
                        |---0---|---NULL----|----KA-----|
                        |---1---|----color---|----white--|
                        usw.

                        Nun, in der Tabelle "user" ist jeder einzelne DS ein user mit seinen Einstellungen.
                        Darunter fallen auch "Farbe, Alter" usw.

                        Wenn nun z.B. die gespeicherte Farbe von dem User mit der "id 17" rausgefunden werden soll, so lese ich die Zelle "color" vom user "17" aus.
                        Diese ID ist dann die ID von "user_setting" und deten value ist dann der entsprechende, gesuchte Wert.

                        Meine Anfänge:

                        PHP-Code:
                        SELECT        u_s.setting,
                                                                
                        u_s.value
                                                                FROM    user_setting u_s
                        ,
                                                                
                        user u
                                                                WHERE
                                                                
                        CASE WHEN    u.id 17
                                                                
                        AND     u.color 0
                                                                THEN    
                        (u_s.setting "color"
                                                                
                        AND        u.id 17
                                                                
                        AND        u.color u_s.id)
                                                                ELSE    (
                        u.id 17
                                                                
                        AND        u_s.id 0
                                                                
                        AND        u.color u_s.id)
                                                                
                        END 

                        Kommentar


                        • #13
                          Boah ich habe mich total verrannt und den Wald vor lauter Bäumen nicht mehr gesehen.
                          Hab die Lösung

                          Danke

                          Kommentar


                          • #14
                            Nehmen wir aber einmal an,
                            ich habe folgenden Code:
                            PHP-Code:
                            SELECT        u_s.setting,
                                                                    
                            u_s.value
                                                                    FROM    user_setting u_s
                            ,
                                                                    
                            user u
                                                                    WHERE    u
                            .id 17
                                                                    
                            AND        u.color u_s.id 
                            Aber "u_s.setting" beinhaltet KEINEN wert,
                            so hat die Ergebniszelle "setting" auch keinen Wert!
                            Jedoch soll in der Ergebniszelle "setting", auch bei keinem Wert "color" angezeigt werden. Denn "color" bzw. "u.color" wird in die SQL-Abfrage als Variable eingefügt.

                            Kommentar


                            • #15
                              Code:
                              SELECT		'color' AS setting,
                              u_s.value
                              FROM	user_setting u_s,
                              user u
                              WHERE	u.id = 17
                              AND		u.color = u_s.id
                              Es bietet sich übrigens an, JOINS auch als solche zu schreiben:
                              Code:
                              SELECT "color" AS setting, u_s.value
                              FROM user u
                              INNER JOIN user_setting u_s ON u.color = u_s.id
                              WHERE u.id = 17
                              Das erhöht die Übersichtlichkeit meist doch enorm.


                              Ansonsten könntest du noch so etwas machen:
                              Code:
                              SELECT us1.setting, COALESCE(us1.value, (SELECT value FROM user_setting WHERE id = 0))
                              FROM user u LEFT JOIN user_setting us1 ON u.color = us1.id
                              WHERE u.id = 17
                              Oder wenn man bei deiner alten Lösung bleiben möchte:
                              Code:
                              SELECT u_s.setting, u_s.value
                              FROM user_setting u_s, user u
                              WHERE u.id = 17 AND u.color = u_s.id
                              ORDER BY (u_s.setting = "color") DESC
                              LIMIT 1
                              (bei der Variante ist dann setting allerdings wieder leer, bei der mit COALESCE nicht.)

                              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                              Wie man Fragen richtig stellt

                              Kommentar

                              Lädt...
                              X