2017-06-05 6 views
0

Ich habe eine Website, die Beiträge anzeigt, und ein Benutzer kann darüber abstimmen. Nachdem sie einmal abgestimmt haben, möchte ich nicht, dass sie dem Nutzer erneut angezeigt wird. Also muss ich eine Abfrage haben, die alle Beiträge abfragt und diejenigen zurückgibt, auf die der Benutzer noch nicht geantwortet hat.Alle Beiträge auswählen, auf die der Benutzer nicht geantwortet hat?

Ich dachte, es wäre am einfachsten, eine Posts-Tabelle, eine Antworttabelle und eine Benutzertabelle zu haben. Die Antworttabelle könnte eine postId und userId enthalten. Dies könnte mir erlauben, alle Posts zu sehen, die ein Benutzer beantwortet hat, aber ich konnte nicht herausfinden, wie man es umdreht, um die Verneinung zu zeigen. Auch scheint es, als wäre es ziemlich langsam, es so zu machen.

Antwort

1

Um alle Beiträge zu finden, dienicht haben noch von einem bestimmten Benutzer gesehen wurde, können Sie die folgende Abfrage versuchen könnte:

SELECT p.* 
FROM posts p 
WHERE NOT EXISTS (SELECT 1 FROM responses r 
        WHERE r.postId = p.postId AND r.userId = <some value>) 

Als Alternative NOT EXISTS zu verwenden, können Sie auch dieser Satz eine LEFT JOIN mit :

SELECT p.* 
FROM posts p 
LEFT JOIN responses r 
    ON p.postId = r.postId AND 
     r.userId = <some value> 
WHERE r.postId IS NULL 
+0

Das scheint gut zu funktionieren, kann ich nicht sagen, ich hätte das, danke! EDIT: Ist eine Version vorzuziehen? Ich Image der linken Join hat ein bisschen eine Geschwindigkeit Vorteil – DasBeasto

+0

@DasBeasto Eigentlich könnte 'NOT EXISTS' der schnellste Weg sein. Wenn Sie in 'Antworten' die richtigen Indizes eingerichtet haben, ist die linke Verknüpfung möglicherweise fast genauso schnell. Wirklich, wählen Sie einfach die Version, die Sie bequemer finden. –

Verwandte Themen