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

时间:2016-11-21 10:47:24

标签: php mysql join

我有两个表,首先存储公告,第二个存储已阅读公告的用户列表。我正在尝试捕获所有状态为已读或未读的公告。如果第二个表不包含与该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但是它们返回空结果。

2 个答案:

答案 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