繁体   English   中英

MYSQL-选择不与其他表连接的所有行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM