mysql其中链接表为null或不等于某个id

时间:2014-08-28 21:32:41

标签: php mysql

我有两张桌子; news和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个故事,但它没有

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

3 个答案:

答案 0 :(得分:3)

您的查询不起作用的原因是:

SELECT story_id, story_name 
FROM stories 
LEFT OUTER JOIN user_has_read.story_id = stories.story_id 
               ^ ON is missing
WHERE user_has_read.user_id IS NULL or != '$user_id'
                                      ^ syntax error since you are not specifying column

将其更改为:

SELECT story_id, story_name 
FROM stories 
LEFT OUTER JOIN ON user_has_read.story_id = stories.story_id 
WHERE user_has_read.user_id IS NULL or user_has_read.user_id != '$user_id'
上面的

假设您正确地获取$user_id的值,意味着它用双引号或您正在使用预准备语句。

答案 1 :(得分:1)

如果您想获取特定用户无法阅读的新闻,您必须在外部联接的加入条件中包含此用户的测试。请注意,此特定用户也不会读取任何人都没有阅读的新闻......

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

对于user_id为12的任何其他值的用户,结果当然是所有新闻:

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

Demo

答案 2 :(得分:1)

VMai的回答是正确的。我们在同一时间发布这个并且子选择是一种不同的方法。

我改为:

SELECT news_id, title FROM news WHERE news_id NOT IN (
  SELECT news_id FROM user_has_read WHERE user_id=2)

那是"从新闻获取行,其中新闻ID不在(新闻用户2已阅读)"。

我认为另一种选择可能是:

SELECT news_id, title FROM news 
LEFT OUTER JOIN user_has_read ON (
  news.news_id= user_has_read.news_id AND 
  user_has_read.user_id=2)
WHERE user_id IS NULL