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

上記の表には、メイントピックとコメントの2種類のコンテンツタイプがあります。メイントピックまたはコメントを識別するために使用される一意のコンテンツ識別子「desid」。「desid」はメイントピックの場合は「a」で始まり、コメントの場合は「desid」は「b」で始まります。コメントの場合、「replyto」は、このコメントが関連付けられているメイントピックの「desid」です。

(賛成+反対+訪問+コメント数)の追加に基づいて整理された上位の主要トピックのリストを見つけたいと思います。次のクエリは、トップトピックのリストを(賛成+反対+訪問)の順に示します。

select *upvote+downvote+viewsクエリによる数が最も多い

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

(comments + 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 に答える