Kjorni: mysql: Problemchen mit left join

Hi,

Kann ich bei einem Left Join auch mit Where-Klausel arbeiten?

Also:

  
select DISTINCT  
         r.ID,  
         r.Name,  
	 ...  
         z.zahl  
         from table1 r  
	 LEFT JOIN table2 z  
	 ON r.ID = z.ID  
         WHERE  
         z.zahl = 0 // <--  

Table1:
ID - Name - usw.

Table2:
ID - usw. - zahl

Es geht also darum,

  1. alle Einträge der Table1 in die Ergebnissmenge einzubeziehen, zu der es in Table2 keinen Eintrag gibt und

  2. zu der es in Table2 zwar einen Eintrag gibt, dieser aber in der Spalte 'zahl' den Wert 0 hat.

Das aber erreicht obige Query natürlich nicht.

Ohne den Zusatz "WHERE z.zahl = 0" könnte ich in einer anschließenden Schleife in php abfragen, ob die Spalte 'zahl' den Wert 1 oder 0 hat.

Geht das auch in einer einzigen Query?

Grüße, Kjorni

  1. Hallo,

    Kann ich bei einem Left Join auch mit Where-Klausel arbeiten?

    prinzipiell ja, aber ...

    select DISTINCT
             r.ID,
             r.Name,
    ...
             z.zahl
             from table1 r
    LEFT JOIN table2 z
    ON r.ID = z.ID
             WHERE
             z.zahl = 0 // <--

      
    natürlich nicht so. Dann kannst Du gleich einen INNER JOIN schreiben.  
      
    
    > Es geht also darum,  
    >   
    > 1) alle Einträge der Table1 in die Ergebnissmenge einzubeziehen, zu der es in Table2 keinen Eintrag gibt und  
    >   
    > 2) zu der es in Table2 zwar einen Eintrag gibt, dieser aber in der Spalte 'zahl' den Wert 0 hat.  
      
    
    > Ohne den Zusatz "WHERE z.zahl = 0" könnte ich in einer anschließenden Schleife in php abfragen, ob die Spalte 'zahl' den Wert 1 oder 0 hat.  
    >   
    > Geht das auch in einer einzigen Query?  
      
    klar. Hatten wir hier schobn öfter. Du möchtest die zweite Bedingung ebenfalls in die JOIN-Bedingung einbauen, vergleiche z.B.  
      
    </archiv/2008/4/t170482/#m1114517>  
    </archiv/2008/8/t175131/#m1150944>  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. klar. Hatten wir hier schobn öfter. Du möchtest die zweite Bedingung ebenfalls in die JOIN-Bedingung einbauen, vergleiche z.B.

      </archiv/2008/4/t170482/#m1114517>
      </archiv/2008/8/t175131/#m1150944>

      Hi Vinzenz,

      habe ich versucht, umzusetzen:

      select DISTINCT  
               r.ID,  
               r.Name,  
               ...  
               z.zahl  
               from table1 r  
               LEFT JOIN table2 z  
               ON r.ID = z.ID  
               AND  
               z.zahl = 0 
      

      Aber dann erhalte ich einfach alle Werte, egal ob die Spalte 'zahl' gleich 0 oder 1 ist.

      In meiner Ergebnissmenge steht dann als Spalte zahl immer 'NULL'.

      Und nun?

      Grüße, Kjorni

  2. Hallo,

    z.zahl = 0  // <--

      
    Anmerkung: Zeilenkommentare in SQL beginnen mit -- nicht mit //  
      
    
    > 1) alle Einträge der Table1 in die Ergebnissmenge einzubeziehen, zu der es in Table2 keinen Eintrag gibt und  
    >   
    > 2) zu der es in Table2 zwar einen Eintrag gibt, dieser aber in der Spalte 'zahl' den Wert 0 hat.  
      
    sorry, hatte Dich falsch verstanden: Eine WHERE-Klausel mit  
      
    ~~~sql
    WHERE  
        [link:http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_coalesce@title=COALESCE](z.zahl, 0) = 0
    

    sollte es tun.

    Freundliche Grüße

    Vinzenz

    1. Hi Vinzenz,

      Anmerkung: Zeilenkommentare in SQL beginnen mit -- nicht mit //

      Danke. Wußt' ich nicht.

      sorry, hatte Dich falsch verstanden: Eine WHERE-Klausel mit

      WHERE

      [link:http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_coalesce@title=COALESCE](z.zahl, 0) = 0

      
      >   
        
      Und tut es auch :-)  
        
      Vielen Dank und viele Grüße  
        
      Kjorni