2012-04-27 3 views
0

스레드 및 게시물이있는 시스템을 구축하려고합니다. 가장 인기있는 스레드를 가져 오려고합니다 (사용자가 "좋아요"버튼을 클릭하여 더 인기있게 만들 수 있음). 대부분의 게시물이 있습니다. 문제는 대부분의 게시물을 통해 결과를 정렬 한 다음 좋아하는 게시물을 정렬하는 것입니다. I 300 게시물 200 개 좋아 가진 스레드가있는 경우 다른 쓰레드가 가지고있는 동안우선 순위별로 count()를 사용하여 T-SQL을 정렬 한 결과

그래서 예를 들어, .. 300 개 좋아 201 likes..I은 제 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를 배치 주문 진술 문을 선택/주문 topic_id 우선 순위 걸릴 것입니다.

UPDATED : 쿼리가 업데이트되었습니다.

+0

사용중인 sql-server의 버전은 무엇입니까? – Arion

+0

@Dmitry Makovetskiyd - 당신은'topic_id'가 우선한다고 가정하는 것이 옳습니다. 빠른 테스트는 당신에게 그렇게 말했을 것입니다 :) –

+0

Visual Studio 2010을 사용하고 있습니다 ... 저장 프로 시저를 구축하고 있습니다 .. 데이터가 없습니다 .. vs2010에 SQL Express 2008 (내장)이 있습니다 –

답변

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 BYPARTITION BY 사이의 차이가 PARTITION BY 그래서이 행의 수에 영향을 미치지 않습니다 인라인 GROUP BY 것입니다. 인라인보기 인 CTE에서이를 사용하고 싶습니다. 명확하게하고 원하는 단계를 분리하십시오. TOP 1을 제거하면 내 뜻을 알 수 있습니다.

+0

축하해. 내 계산서 같아. 그룹별로 사용했는데 파티션을 사용 했어. 차이점이 뭐야? –

+1

답변이 업데이트되었습니다. 질문에 답변 해 주셨으면 좋겠다. – Arion