2015-04-22 10 views
7

ich vier Tabellen (in [] sind Spalten):mysql select/löschen Verwendung kommen über vier Tabellen

users [id]

products [id]

productRatings [id,value,user,product]

comments [id,product,user]

würde ich Ich mag es, productRatings auszuwählen und schließlich zu löschen, wenn der derselbe Benutzer für dieses Produkt. Das heißt, wenn der Nutzer das Produkt bewertet, aber nicht kommentiert hat, sollte diese Bewertung gelöscht werden.

Ich glaube, ich konnte erreichen, dass durch zwei Abfragen verwenden, zuerst:

SELECT user, product FROM productRatings 

und dann für jede Zeile:

SELECT COUNT(*) FROM comments WHERE product=productRatings.product AND user=productRatings.user 

und dann so etwas wie

if $queryAbove==0 : DELETE FROM productRatings WHERE id=productRatings.id 

würde ich löse dies gerne über JOIN und lerne mehr durch ein Beispiel, anstatt dich durch JOIN Tutorials zu blättern.

Antwort

4

Sie müssen nur die productratings und Kommentare Tabelle - die folgenden Werke:

delete pr 
from productratings pr 
left join comments c 
    on pr.userid = c.userid 
    and pr.productid = c.productid 
where c.productid is null 

Und es gibt eine Demo hier: http://sqlfiddle.com/#!9/89575/1

+0

Das hat es geschafft, danke, dieses Join-Ding ist wirklich einfach, wenn du weißt, was du tust – dbr

0
DELETE FROM productRatings WHERE id IN (SELECT pr.id FROM productRatings pr 
     LEFT JOIN comments c on c.product = pr.product 
     WHERE c.user = pr.user 
     AND pr.comment IS NULL) 
+0

Dies erreichen nicht, was der OP gefragt hat. Es möchte eine Produktbewertung löschen, bei der kein Kommentar von dem Benutzer vorhanden ist, der die Produktbewertung erstellt hat. Nicht behalten, wenn irgendein Kommentar existiert –

+0

@pala_ Danke! Ich war zu schnell. – smiggle

+0

würde dies wahrscheinlich darin scheitern, dass 'WHERE id =' mit einer verschachtelten Auswahl, die mehr als ein Ergebnis liefern wird. mit Ihrer Verwendung von 'IS NULL' sollte wahrscheinlich' IN' anstelle von '=' –

1

sollten Sie in der Lage sein, nur die Felder in der Abfrage zu verbinden und dann prüfen, ob der Kommentar leer ist, wie so ...

DELETE FROM `productRatings` 
JOIN `comments` ON (`productRatings`.`product` = `comments`.`product`) 
WHERE `comments`.`comment_field` IS NULL 
AND `productRatings`.`user_id` = ?; 

Der IS NULL müssen mit = ersetzt werden '' abhängig von der verwendeten Datenbank-Engine.

Denken Sie daran, zuerst eine Testinstanz der DB zu testen!

+0

Ich bin mir nicht sicher, ob Sie der Benutzertabelle beitreten müssen, da sowohl Kommentare als auch Bewertungstabellen Benutzer-IDs haben. –

+0

True, Bearbeitung der Antwort, danke –

+0

Ich denke, das wird fehlschlagen, weil es ein Join ist und Sie nicht angegeben haben, aus welcher Tabelle gelöscht werden soll. –

2
DELETE FROM `productRatings` WHERE productRatings.id NOT IN (
SELECT productRatings.id FROM `productRatings` JOIN `comments` ON productRatings.user = comments.user AND productRatings.product = comments.product) 

ich Kopien der Tabellen in Frage stellen würde und Test, dass die oben genannten Arbeiten auf den Testtabellen, bevor auf dem Produktions Tabellen mit diesem.

Grundsätzlich gibt die geschachtelte Auswahl alle Produktreihen-IDs zurück, die der Benutzer, der die Bewertung geschrieben hat, auch kommentiert hat. Mit NOT IN werden alle Bewertungen gelöscht, die der Benutzer, der die Bewertung erstellt hat, nicht kommentiert hat.

Da pala_ in den Kommentaren hervorgehoben ist, weil diese Methode verschachtelte SQL verwendet, wird sie schlechter abschneiden als eine Methode, die nur Joins in größeren Tabellen verwendet.

+0

für große Tabellen, wird dies schlechter als eine Version, die nur Joins verwendet. –

+0

@pala_ ja, ich werde das zu meiner Antwort hinzufügen. Ihre Antwort scheint insofern überlegen zu sein, als sie nicht geschachtelte SQL verwendet. –