1

“讨论”表架构

title      description    desid    replyto    upvote    downvote   views
browser    used           a1        none        1          1       12
-          bad topic      b2        a1          2          3       14
sql        database       a3        none        4          5       34
-          crome          b4        a3          3          4       12

上表有两种内容类型 Main Topics 和 Comments。唯一的内容标识符 'desid' 用于标识它的主题或评论。'desid' 以 'a' 开头代表主题,评论 'desid' 以 'b' 开头。对于评论,“replyto”是与该评论相关联的主要主题的“目标”。

我喜欢找出根据(upvote+downvote+visits+对其的评论数)添加排列的主要主题列表。以下查询按(upvote+downvote+visits)的顺序给出了热门主题列表

select *upvote+downvote+views查询次数最多的

select * 
from [DB_user1212].[dbo].[discussions] 
where desid like 'a%'
order by (upvote+downvote+visited) desc

对于(评论+upvote+downvote+views)我试过

select *
from [DB_user1212].[dbo].[discussions]
where desid like 'a%'
order by (select count(*)
           from [DB_user1212].[dbo].[discussions]
           where replyto = desid )+upvote+downvote+visited) desc 

但它没有用。因为不可能将 desid 从外部查询发送到内部子查询。请告诉我如何解决这个问题。请注意,我只需要查询语言的解决方案。

4

2 回答 2

2

您需要使用表别名:

select *
from [DB_user1212].[dbo].[discussions] d1 --alias
where desid like 'a%'
order by (select count(*)
           from [DB_user1212].[dbo].[discussions] d2
           where d2.replyto = d1.desid )+upvote+downvote+visited) desc

现在,在子查询中,您可以通过别名(此处为d1)引用外部表。我还添加了d2,这在此处不是必需的,但在子查询中显式会很有用。

于 2012-11-07T08:01:10.757 回答
2

我认为这会起作用:) 请告诉我。

WITH x AS
    (
    select count(*) numberofcomments, replyto
               from [DB_user1212].[dbo].[discussions]
               GROUP BY replyto
    )

    select [DB_user1212].[dbo].[discussions].*
    from [DB_user1212].[dbo].[discussions]
    inner JOIN x 
    ON [DB_user1212].[dbo].[discussions].desid = x.replyto
    where desid like 'a%'
    ORDER BY (numberofcomments+upvote+downvote+visited)
于 2012-11-07T07:46:43.917 回答