[英]MYSQL - Select all rows that don't join with other table
我有两个表,第一个存储公告,第二个存储已阅读公告的用户列表。 我正在尝试捕获所有状态为已读或未读的公告。 如果第二个表不包含与该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
部分无法正常工作。 由于用户2已查看公告3,所以未显示。
很难解释,但我想加载所有公告,并有一栏可以告诉我该公告是否已被特定用户查看。 (谁的ID可用)。 有人可以给我提示吗?
我也尝试过NOT EXISTS和NOT IN,但是它们返回空结果。
我不确定我是否理解问题,但是如果用户已阅读公告,则也许可以使用它来创建一个额外的列,以在其中存储。
CASE case_value
WHEN when_value THEN statements
ELSE statements
END
我想我了解您的需求。 让我们看一下:您需要所有公告的列表,并有一个额外的列,说明该公告是否已被特定用户阅读。 在这种情况下,您需要在联接条件内添加用户ID的过滤器,而不是在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.