Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为SQL Server 2008中的每个主题选择最新主题_Sql - Fatal编程技术网

为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,你能为那些表共享一些记录吗。此类问题应提供一些样本数据。非常感谢。