加入3个表和匹配的空条目

问题描述 投票:0回答:1

我有3个表格,用户,新闻,news_viewed。我正在尝试加入这3个表并查找每个用户未查看的新闻列表。

  • TABLEusers
    • 用户ID
    • 用户名
    • 状态
  • TABLEnews
    • newsid
    • 标题
    • post_time
  • TABLEnews_viewed
    • nvid
    • 用户名
    • newsid

希望从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。

任何帮助将不胜感激,谢谢!

php mysql join
1个回答
0
投票

这是使用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

此查询尝试将JOINnews_viewed用于news用户(发布时间大于?所指示的参数的新闻),并返回未成功加入的用户(因此,反模式)。

注意:不清楚在连接中使用哪一列;列名news_viewed (username)倾向于表明它与users(username)相关,而users的主键似乎是userid。修正您的列名或关系。

© www.soinside.com 2019 - 2024. All rights reserved.