0

スレッドと投稿があるシステムを構築しようとしています。最も人気があり(ユーザーは「いいね」ボタンをクリックして人気を高めることができます)、ほとんどの投稿があるスレッドを取得しようとしています。問題は、ほとんどの投稿で結果を並べ替えてから、いいねした投稿で並べ替えることです。

たとえば、投稿が300、いいねが200のスレッドがあり、別のスレッドがいいねが300、いいねが201のスレッドがある場合、2番目の投稿を選択します。

一言で言えばテーブル構造:

topic:
--------
topic_id
liked

comment:
-------
comment_id
topic_id

これまでのストアドプロシージャは次のとおりです。

   dbo.Trends

AS
    SELECT TOP 1 title, COUNT(com.topic_id), COUNT(topc.user_id_liked) 
FROM comment AS com
INNER JOIN topic AS topc ON com.topic_id=topc.topic_id
GROUP BY com.topic_id, topc.user_id_liked,title
ORDER BY COUNT(com.topic_id), COUNT(topc.user_id_liked) DESC

自分が正しいかどうか、またはフローロジックを制御するために結果を出す必要があるかどうかはわかりません。トピックテーブルのtopic_idをorderステートメントのtopiclike列の前に配置しました。topic_idの選択/順序付けが優先されることを期待しています。

更新:クエリが更新されました。

4

1 に答える 1

2

私はあなたが欲しいことを本当に知りません。しかし、多分これは役立つでしょう:

;WITH CTE
AS
(
    SELECT
        COUNT(com.topic_id) OVER(PARTITION BY topc.liked) AS topicCount,
        COUNT(com.liked) OVER(PARTITION BY topc.topic_id) AS likedCount,
        title
    FROM 
        commnet AS com
        INNER JOIN topic AS topc 
            ON com.topic_id=topc.topic_id
)
SELECT TOP 1
    CTE.title,
    CTE.topicCount,
    CTE.likedCount
FROM
    CTE
ORDER BY
    topicCount,
    likedCount

編集

GROUP BYとの違いPARTITION BYPARTITION BYインラインでGROUP BYあるため、行数には影響しません。インラインビューであるCTEでそれを使用するのが好きです。それをより明確にし、あなたがしたい異なるステップを分離します。削除すると、TOP 1私が何を意味するかがわかります。

于 2012-04-27T09:13:28.127 に答える