SQL左联接:选择最后的记录
我有一个项目表和一个评论表。一个项目可以有很多评论。我想获得所有项目的列表,其中评论发布时间>30天,或者没有评论的项目。实现这一目标的最佳方式是什么 我有过很多失败的尝试;这是我最近一次尝试SQL左联接:选择最后的记录,sql,sql-server-2000,Sql,Sql Server 2000,我有一个项目表和一个评论表。一个项目可以有很多评论。我想获得所有项目的列表,其中评论发布时间>30天,或者没有评论的项目。实现这一目标的最佳方式是什么 我有过很多失败的尝试;这是我最近一次尝试 SELECT p.id, p.officialStatus, c.posted FROM projects p LEFT JOIN ( SELECT max(posted) as posted,
SELECT p.id,
p.officialStatus,
c.posted
FROM projects p
LEFT JOIN
(
SELECT max(posted) as posted,
projectid
FROM comments
WHERE DATEDIFF(day, posted, GETDATE()) > 30
OR comment IS NULL
group by projectid
) c ON p.id = c.projectid
WHERE (p.officialStatus NOT IN ('Blue', 'Canceled'))
请在回答中使用以下表格/列名:
项目:id,officialStatus
注释:id、projectID、postedOn
我认为你的主要问题是外部连接,这正是你不需要的。。。在这个调整中,没有注释的项目将有一个空的max_posted date
SELECT projects.id FROM projects
LEFT JOIN
(SELECT comments.projectID
FROM comments
GROUP BY comments.projectID
HAVING DATEDIFF(Now(), MAX(comments.postedOn)) < 30) AS C
ON projects.id = C.projectID
WHERE C.projectID IS NULL;
-还有执行计划,感谢@Barbara在sqlfiddle上准备此测试我使用的是SQL Server函数DateAdd,它在MySQL或Oracle中不存在,但在这些平台上有等价物。我根据您在示例查询中使用的DateDiff假设了SQL Server。您好,谢谢您的回复。我会尝试一下你的查询,并让你知道结果。我昨天刚发现sqlfiddle,我恋爱了。谢谢你的回复Barbara。对不起,我应该在我的第一个问题中说得更清楚,我运行的是MS SQL 2000,它不识别“当前日期”。有什么建议吗?我同意Wirus+1对sqlfiddle的看法!它现在能识别吗?GetDate怎么样?是的,你抢先了。我还必须为MS SQL的DATEDIFFday、MAXcomments.posted和getdate添加一个附加参数。我将验证数据并让您知道结果。再次感谢你的帮助!再次感谢芭芭拉,返回数据已签出。如果有人对我的工作问题感兴趣。嗨,威勒斯,谢谢你的回复。对不起,我在第一个问题中没有说得更清楚,我正在运行MS SQL 2000,但它不识别“当前日期”。有什么建议吗?我想知道,选择正确答案的标准是什么?其他查询是否错误并返回无效数据?或者他们也很好,但是选择的那个有最好的表现?我认为这个问题的答案可能是你的文章的宝贵成果。
SELECT projects.id FROM projects
LEFT JOIN
(SELECT comments.projectID
FROM comments
GROUP BY comments.projectID
HAVING DATEDIFF(Now(), MAX(comments.postedOn)) < 30) AS C
ON projects.id = C.projectID
WHERE C.projectID IS NULL;
select p.*, max(c.postedOn) as postedDate from Projects p
left join Comments c on p.id = c.projectId
group by p.id
having COALESCE( postedDate, DATE_SUB(CURRENT_DATE, INTERVAL 31 DAY ) ) <
DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY );