MySQL -> Nur Datensätze wo kein Eintrag
Piek
- datenbank
0 Vinzenz Mai0 EKKi
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
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
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
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
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