我有两个桌子。新闻和user_has_read

新闻表

news_id  title
1        happy days
2        war on the horizion
3        celebrity does something


用户已阅读新闻

news_id user_id date
1       1       jan 1
1       2       jan 2
2       1       jan 4


基本上,我想查找所有已存在但尚未被特定用户阅读或未被特定用户阅读的故事-因此我可以统计通知

所以像

SELECT
news_id,
title
FROM news
LEFT OUTER JOIN user_has_read ON
user_has_read.news_id = news.news_id
WHERE user_has_read.user_id IS NULL or user_has_read.user_id != 2


但这出于某些原因不起作用,有什么想法吗?

它应显示user_id(在本例中为2)尚未阅读2个故事,但没有

有没有更好的方法来解决这个问题?

最佳答案

如果要获取特定用户未读的新闻,则必须在外部联接的联接条件中包括对该用户的测试。请注意,这个特定用户也不会阅读任何人都无法阅读的新闻...

SELECT
    n.news_id,
    un.user_id
FROM
    news n
LEFT JOIN
    user_has_read_the_news un
ON
    n.news_id = un.news_id AND un.user_id = 2
WHERE
    un.user_id IS NULL;


返回使用id = 2用户尚未阅读的新闻:

您的样本数据的结果:

news_id | user_id
-----------------
      2 | NULL
      3 | NULL


对于user_id为1的结果将是

news_id | user_id
-----------------
      3 | NULL


对于用户ID为12的用户,其结果当然是所有新闻:

news_id | user_id
-----------------
      1 | NULL
      2 | NULL
      3 | NULL


Demo

关于php - 链接表为null或不等于某些id的mysql,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25558377/

10-09 00:27