2016-11-21 53 views
0

我有兩個表,首先存儲公告,第二存儲讀取公告的用戶列表。我正試圖捕獲所有狀態爲已讀或未讀的通知。如果第二個表不包含與該announcement_id相對應的user_id行,則它是未讀的。下面是它的樣子MYSQL - 選擇所有不與其他表加入的行

公告

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

公告閱覽次數

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

(用戶1已經閱讀公告1和2,用戶2已經閱讀公告1)

最好我到目前爲止的事情是

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) 

問題是我根本不會得到公告3。 avc.user_id IS NULL部分不能正常工作。公告3沒有出現,因爲它已被用戶2查看。

這很難解釋,但我想加載所有通知並有一列可以告訴我該公告是否已被特定用戶查看過。 (誰的ID是可用的)。有人可以給我一個提示嗎?

我也試過不存在,但沒有,但他們返回空結果。

+0

沒有人可以試試你的查詢,因爲你已經發布的表不匹配查詢 – e4c5

+0

你的「最好的事情至今」正在爲你沒有在規定列名的引用你的描述。根據您提供的表格數據,日期與它有什麼關係。你需要告訴我們更多,還是你已經提供的,你的意圖?我只看到兩個表,每列有三列。 – TimBrownlaw

+0

對不起。我不想包括不必要的專欄。請再次檢查 – VeeK

回答

0

我想我明白你需要什麼。讓我們看看:您需要所有公告的列表,並在附加列中說明公告是否已被特定用戶閱讀。在這種情況下,您需要在連接條件中爲用戶標識添加過濾器,而不是在where子句中作爲全局條件。您可以使用這樣的事情:

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

燦爛的人。我試圖從IS NULL部分捕獲相同的東西。如果你刪除了所有的「過濾器」,那麼user_id會顯示爲null,這是你的代碼所捕獲的。誰降低了? – VeeK

+0

不知道誰低估了,我很想知道我的方法有什麼問題,所以我可以改進它。 – phobia82

+0

我得到了我想要的東西,所以非常感謝。 – VeeK

0

我不確定我是否理解這個問題,但是如果用戶閱讀了該公告,則可以使用它創建一個額外的列,以供您存儲。

CASE case_value 
    WHEN when_value THEN statements 
    ELSE statements 
END