我有两张桌子; 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个故事,但它没有
有没有更好的方法来解决这个问题?
答案 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为1
或2
的任何其他值的用户,结果当然是所有新闻:
news_id | user_id
-----------------
1 | NULL
2 | NULL
3 | NULL
答案 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