我有3个表格,用户,新闻,news_viewed。我正在尝试加入这3个表并查找每个用户未查看的新闻列表。
users
news
news_viewed
希望从users
中查找尚未阅读新闻的列表(在news_viewed
中找到)
我尝试了许多不同的联接,包括左联接以及内部和外部,但无法获得所需的结果。
$_30daysago = strtotime('-30 days');
SELECT * FROM
(
SELECT users.username, news_id
FROM users inner join news_viewed ON
users.username = news_viewed.username and users.status='active'
UNION
SELECT news_viewed.username, post_time
FROM news_viewed inner join news ON
news_viewed.newsid = news.newsid and news.post_time>'$_30daysago'
) as JoinedTable
我需要所需的结果以包含users.username,news.newsid和news.title。
任何帮助将不胜感激,谢谢!
这是使用LEFT JOIN
反模式的好地方:
SELECT u.*
FROM users u
LEFT JOIN news_viewed nv
ON nv.username = u.username -- or u.userid?
LEFT JOIN news n
ON n.newsid = nv.newsid
AND news.post_time > ?
WHERE
u.status = 'active'
AND nv.nvid IS NULL
此查询尝试将JOIN
和news_viewed
用于news
用户(发布时间大于?
所指示的参数的新闻),并返回未成功加入的用户(因此,反模式)。
注意:不清楚在连接中使用哪一列;列名news_viewed (username)
倾向于表明它与users(username)
相关,而users
的主键似乎是userid
。修正您的列名或关系。