我有两个表,首先存储公告,第二个存储已阅读公告的用户列表。我正在尝试捕获所有状态为已读或未读的公告。如果第二个表不包含与该announcement_id对应的user_id行,则它是未读的。这是它的样子
通告
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已查看该公告。
这很难解释,但我想加载所有声明,并有一列可以告诉我特定用户是否已查看该声明。 (谁的身份证明可用)。有人可以给我一个暗示吗?
我也试过NOT EXISTS而不是IN但是它们返回空结果。
答案 0 :(得分:0)
我不确定我是否理解这个问题,但也许您可以使用它来创建一个额外的列,如果用户已阅读该公告,您可以存储该列。
CASE case_value
WHEN when_value THEN statements
ELSE statements
END
答案 1 :(得分: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