Piek: MySQL -> Nur Datensätze wo kein Eintrag

Hallo,

leider hat unser Programmierer urlaub und ich habe den Auftrag bekommen per PHP MYAdmin alle Artikel ID´s zu finden, die noch keine Kommentare haben.

Hierzu muss ich die zwei Tabellen (Tabelle A = "kommentar"; Tabelle B ="daten") per INNER JOIN verbinden.

Soweit so gut, ich habe mir also folgenden query zusammengebaut, um die letzten Kommentare an zu Zeigen, wie aber kann ich nun die ID´s bekommen die "KEINE" Kommentare haben die im spam = 0 und bei freischalten = 0 sind?

Ich glaube da hört mein Latein einfach auf.

SELECT a.autor, a.inhalt, a.voting, b.bezeichnung, b.ort, b.id, b.kreis  
										FROM kommentar AS a  
										INNER JOIN daten AS b ON ( a.artikel_id = b.id )  
										WHERE a.spam = '0'  
										AND a.freigeschaltet = '0'  
										ORDER BY a.datum DESC  
										LIMIT 7
  1. Hallo,

    leider hat unser Programmierer urlaub und ich habe den Auftrag bekommen per PHP MYAdmin alle Artikel ID´s zu finden, die noch keine Kommentare haben.

    Hierzu muss ich die zwei Tabellen (Tabelle A = "kommentar"; Tabelle B ="daten") per INNER JOIN verbinden.

    Nein. Eben nicht. Wenn es noch keine Kommentare gibt, benötigst Du einen OUTER JOIN. Du könntest auch ein Subselect nehmen.

    Ich glaube da hört mein Latein einfach auf.

    Wie wär's mit SQL statt Latein?

    SELECT a.autor, a.inhalt, a.voting, b.bezeichnung, b.ort, b.id, b.kreis

      								FROM kommentar AS a  
      								INNER JOIN daten AS b ON ( a.artikel_id = b.id )  
      								WHERE a.spam = '0'  
      								AND a.freigeschaltet = '0'  
      								ORDER BY a.datum DESC  
      								LIMIT 7
    
      
    Du möchtest die ID-Werte aus der Tabelle daten haben, für die es keine entsprechung in der Tabelle kommentar gibt, am einfachsten ist dies 1:1 mit einem Subselect umzusetzen:  
      
    ~~~sql
    SELECT                     -- Gib mir  
        id                     -- die id-Werte  
    FROM                       -- aus der Tabelle  
        daten                  -- daten,  
    WHERE                      -- wobei mich nur die Datensätze interessieren,  
        id NOT IN (            -- deren id nicht in der Liste  
            SELECT  
                artikel_id     -- der Artikel-IDs  
            FROM               -- aus der Tabelle  
                kommentare     -- kommentare  
        )                      -- vorkommen  
    
    

    Anmerkung:
    Wenn Du noch weitere Informationen aus der Tabelle daten benötigst, frage diese mit ab. Da es noch keinen zugehörigen Eintrag in der Tabelle kommentare gibt, ist es nicht sinnvoll, Spalten aus der Tabelle kommentare abzufragen.

    Hinweis: Aliasnamen sind oftmals sinnvoll, jedoch sollte man die Namen *sinnvoll* wählen. a und b sind keine sinnvollen Aliasnamen für "daten" und "kommentare".

    Freundliche Grüße

    Vinzenz

  2. Mahlzeit Piek,

    Hierzu muss ich die zwei Tabellen (Tabelle A = "kommentar"; Tabelle B ="daten") per INNER JOIN verbinden.

    Das ist vermutlich nicht ganz korrekt. Ich würde Dir dazu die "Einführung in Joins" empfehlen.

    Soweit so gut, ich habe mir also folgenden query zusammengebaut, um die letzten Kommentare an zu Zeigen, wie aber kann ich nun die ID´s bekommen die "KEINE" Kommentare haben die im spam = 0 und bei freischalten = 0 sind?

    Ganz einfach - basierend auf Deiner bisherigen Abfrage:

    SELECT a.autor, a.inhalt, a.voting, b.bezeichnung, b.ort, b.id, b.kreis -- Gib mir alle möglichen Felder  
      FROM kommentar AS a                                                   -- aus der Tabelle "kommentar"  
      LEFT JOIN daten AS b ON ( a.artikel_id = b.id )                       -- und der optional verknüpften Tabelle "daten"  
     WHERE a.spam = '0'                                                     -- bei denen das Feld "spam" in der Tabelle "kommentar" den Wert 0 hat  
       AND a.freigeschaltet = '0'                                           -- und das Feld "freigeschaltet" in der Tabelle "kommentar" den Wert 0 hat  
       AND b.id IS NULL                                                     -- und das Feld "id" in der Tabelle "daten" leer ist (d.h. der entsprechende Datensatz ist dort nicht vorhanden)  
     ORDER BY a.datum DESC                                                  -- absteigend sortiert nach Datum  
     LIMIT 7                                                                -- und davon nur die ersten 7 Stück
    

    MfG,
    EKKi

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

      LEFT JOIN daten AS b ON ( a.artikel_id = b.id )                       -- und der optional

      Mus ein Left Join nicht immer einen Partner haben?
      Piek ging es aber meines Verständnisses nach darum, gerade diejenigen Datensätze zu finden, die nocb keinen Partner haben in der Beschreibungstabelle, _oder_ deren Beschreibung leer ist, wenn es schon einen Datensatz geben sollte.

      In sofern wäre Vinzenz' Lösung auch noch nicht fertig. Der findet nur diejenigen ohne Partner.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. moin,

        LEFT JOIN daten AS b ON ( a.artikel_id = b.id )                       -- und der optional

        Mus ein Left Join nicht immer einen Partner haben?

        Ekki hat die beiden tabellen vertauscht, es sollte von daten ausghend ein OUTER JOIN auf die kommentar tabelle sein. es geht auch über einen OUTER JOIN zu lösen, ist aber ein wenig trickreich.

        In sofern wäre Vinzenz' Lösung auch noch nicht fertig. Der findet nur diejenigen ohne Partner.

        Vinzenz geht schon den beseren weg, nämlich über eine unterabfrage.ich persönlich würde eine EXISTS prüfung machen, aber das ist sicherlich geschmackssache. und die zusätzlichen bedingungen, die Vinzenz dort vergessen hat sind schnell eingebaut.

        Ilja