为SQL Server 2008中的每个主题选择最新主题
我有一个关于规划论坛的项目 我在数据库中有两个表:为SQL Server 2008中的每个主题选择最新主题,sql,Sql,我有一个关于规划论坛的项目 我在数据库中有两个表: 主题(idSUB,titleSUB) 主题(idTOP、titleTOP、contentTOP、idSUB、idUser[user create TOPIC],Time) 我想要的是: + select COUNT(*) from TOPIC as numTOPIC group by idSUB--> as Table A +select TOP 1 titleTOP order by Time desc-> as newes
(idSUB,titleSUB)李>主题
(idTOP、titleTOP、contentTOP、idSUB、idUser[user create TOPIC],Time)李>主题
+ select COUNT(*) from TOPIC as numTOPIC group by idSUB--> as Table A
+select TOP 1 titleTOP order by Time desc-> as newestTOP group by idSUB---> as Table B
+ Then JOIN 3 table A,B,SUBJECT--> C(idSUB,titleSUB,numTOPIC,newestTOP, idUser (who created the newest topic))
我找到了左连接的方法
A
,主题
->C(idSUB,titleSUB,numTOPIC)
,但我真的不知道连接上面3个表的正确语法
SELECT
a.idSUB, a.titleSUB,
COUNT(b.idSUB) numTOPIC
FROM
SUBJECT a
LEFT JOIN
TOPIC b ON a.idSUB = b.idSUB
GROUP BY
a.idSUB, a.titleSUB
我只想在一个查询中执行此操作。救命啊
更新:
根据下面的@John Bingham
代码,输出表无法显示没有任何主题的主题。我希望所有的主题都能显示出来
SELECT
s.idSUB, s.titleSUB, a.numTOPIC,
isnull(b.newestTOP, '') as [Newest Topic],
isnull(b.idUser, '')
FROM
Subject s
INNER JOIN
(SELECT
IDSub, Count(*) as NumTopic
FROM
Topic
GROUP BY IDSub) a ON s.IDSub = a.IDSub
LEFT JOIN
(SELECT
t.IDSub, t.titleTop as newestTop, t.idUser as [idUser]
FROM
Topic t
INNER JOIN
(SELECT IDSub, Max([Time]) as tm
FROM Topic
GROUP BY IDSub) x ON t.IDSub = x.IDSub
WHERE t.[Time] = x.tm) b ON s.IDSub = b.IDSub
这是一个正确的查询,但我想更准确地说,帮助 我倾向于将每个需求(a)、(b)和(c)转换为子查询,这些子查询将虚拟表传递给您的查询,而不是试图组合基表以一次性传递需求。所以-
SELECT s.idSUB, s.titleSUB, a.numTOPIC, isnull(b.newestTOP, '') as [Newest Topic],
isnull(b.idUser, '')
FROM Subject s
INNER JOIN (SELECT IDSub, Count(*) as NumTopic FROM Topic GROUP BY IDSub) a
ON s.IDSub = a.IDSub
LEFT JOIN (
SELECT t.IDSub, t.titleTop as newestTop, t.idUser as [idUser]
FROM Topic t
INNER JOIN (
SELECT IDSub, Max([Time]) as tm FROM Topic GROUP BY IDSub
) x ON t.IDSub = x.IDSub
WHERE t.[Time] = x.tm
) b ON s.IDSub = b.IDSub
您希望显示idSub
,titleSub
,numTopic
,newestTOP
,idUser
,其中numTopic
是任何主题中的主题数,即idSub
和newestTOP
是同一主题的最新主题
我使用MySQL并测试了以下查询,结果很好
SELECT S.idSub, S.titleSUB, TOPIC_COUNT_TABLE.NUMTOPIC, NEWESTTOPIC_TABLE.NEWESTTOPIC,
NEWESTTOPIC_TABLE.IDUSER
FROM SUBJECT S,
(SELECT IDSUB, COUNT(*) AS NUMTOPIC FROM TOPIC
GROUP BY TOPIC.IDSUB) AS TOPIC_COUNT_TABLE,
(SELECT T.IDSUB,T.titleTOP AS NEWESTTOPIC, T.IDUSER
FROM TOPIC T,(SELECT IDTOP,IDSUB,MAX(TIME) AS MAXTIME FROM TOPIC
GROUP BY IDSUB ) AS MAXTIME_TABLE
WHERE T.TIME = MAXTIME_TABLE.MAXTIME) AS NEWESTTOPIC_TABLE
WHERE S.IDSUB = NEWESTTOPIC_TABLE.IDSUB AND S.IDSUB = TOPIC_COUNT_TABLE.IDSUB;
您正在使用哪个数据库?谢谢,这是正确的,但是没有任何主题的主题不能显示在输出表中。救命啊!我希望所有主题都可以显示选择s.MA_CHUYEN_DE,s.TIEU_DE,a.numTOPIC,isnull(b.newestTOP,')作为[最新主题],isnull(b.USERNAME,)
-->即使这一行,没有任何主题的主题也无法显示,我真的不知道为什么?将内部连接(在“主题s”之后)更改为左连接。谢谢亲爱的,但这不是我想要的正确答案。输出表在每行的newestTOPIC列中显示所有主题。您在MySQL中尝试过吗?你能为那些表共享一些记录吗?我使用SQL server 2008,你能为那些表共享一些记录吗。此类问题应提供一些样本数据。非常感谢。