2016-11-21 3 views
0

Ich habe zwei Tabellen, speichert zuerst die Ankündigungen und speichert die Liste der Benutzer, die die Ankündigungen gelesen haben. Ich versuche, alle Ankündigungen mit dem Status "gelesen" oder "ungelesen" zu erfassen. Wenn die zweite Tabelle keine Zeile user_id enthält, die dieser answer_id entspricht, ist sie ungelesen. Hier ist, wie es wieMYSQL - Wählen Sie alle Zeilen, die nicht mit anderen Tabelle

Ankündigungen sieht

id | content | announce_on 
1 | foo  | 2016-11-10 
2 | bar  | 2016-11-11 
3 | zim  | 2016-11-12 

Ankündigung View Count

id | user_id | announcement_id 
1 | 1  | 1 
2 | 1  | 2 
3 | 2  | 1 
4 | 2  | 3 

(Benutzer 1 gelesen hat Ansage 1 und 2, Benutzer 2 gelesen Ansage 1)

Die beste was ich bisher habe ist

SELECT 
    *, 
    a.id AS annId 
FROM 
    announcement a 
LEFT JOIN 
    announcement_view_count avc 
ON 
    avc.announcement_id = a.id 
WHERE 
    a.announce_on <= CURRENT_DATE AND (avc.user_id = 1 OR avc.user_id IS NULL) 

Das Problem ist, dass ich Ankündigung 3 überhaupt nicht erhalten werde. Der avc.user_id IS NULL Teil funktioniert nicht richtig. Ankündigung 3 wird nicht angezeigt, weil sie von Benutzer 2 angezeigt wurde.

Es ist schwer zu erklären, aber ich möchte alle Ankündigungen laden und habe eine Spalte, die mir sagen könnte, ob die Ankündigung von einem bestimmten Benutzer angesehen wurde. (Wer ist ID ist verfügbar). Kann mir jemand einen Hinweis geben?

Ich habe auch versucht, nicht EXISTS und nicht in, aber sie geben leere Ergebnisse zurück.

+0

niemand Ihre Frage versuchen kann, weil die Tabellen, die Sie nicht mit der Abfrage übereinstimmen – e4c5

+0

Ihre „bisher Beste“ geschrieben haben, ist Verweise auf Spaltennamen zu machen, dass Sie nicht in zur Verfügung gestellt haben deine Beschreibung. Basierend auf den von Ihnen bereitgestellten Tabellendaten, was haben Daten damit zu tun? Müssen Sie uns mehr erzählen, oder haben Sie bereits, was Sie beabsichtigt haben? Ich sehe nur zwei Tabellen mit je 3 Spalten. – TimBrownlaw

+0

Entschuldigung. Ich wollte keine unnötigen Spalten einfügen. Bitte überprüfen Sie erneut – VeeK

Antwort

0

Ich denke, ich verstehe, was Sie brauchen. Mal sehen: Sie brauchen die Liste aller Ansagen mit einer zusätzlichen Spalte, die sagt, ob die Ansage von einem bestimmten Benutzer gelesen wurde. In diesem Fall müssen Sie den Filter für die Benutzer-ID innerhalb der Join-Bedingung und nicht als globale Bedingung in der where-Klausel hinzufügen. Sie können so etwas wie folgt verwenden:

SELECT 
    a.*, 
    (avc.announcement_id is not NULL) wasRead 
FROM 
    announcement a 
LEFT JOIN 
    announcement_view_count avc 
ON 
    (avc.announcement_id = a.id AND avc.user_id = 1) 
WHERE 
    a.announce_on <= CURRENT_DATE 
GROUP BY a.id 
+0

Brilliant Mann. Ich habe versucht, das gleiche aus IS NULL Teil zu erfassen. Wenn Sie alle 'Filter' entfernen, wird die Benutzer-ID als Null angezeigt, was von Ihrem Code erfasst wird. Wer hat abgelehnt? – VeeK

+0

Keine Ahnung, wer downvoted, ich würde gerne wissen, was mit meinem Ansatz falsch ist, damit ich es verbessern kann. – phobia82

+0

Ich habe genau das, was ich wollte, also danke dafür. – VeeK

0

Ich bin mir nicht sicher, ob ich das Problem verstehe, aber vielleicht können Sie damit eine zusätzliche Spalte erstellen, in der Sie speichern können, wenn der Benutzer die Ankündigung gelesen hat.

CASE case_value 
    WHEN when_value THEN statements 
    ELSE statements 
END 
Verwandte Themen