2013-05-15 5 views
0

나는 내 데이터베이스에서 특정 게시물에 대해 내가 좋아하는 많은 것들을 계산하고 싶다.이 간단한 쿼리 쇼를 얼마나 많이 만들었 는가? 하나의 리소스 "게시"에 대해 가지고 있지만 메인 스크립트에 추가 할 때 결과의 기반으로같은 수를 계산하는 방법

SELECT  COUNT(Likes.resourceID) AS Count_resID, Resources.Id 
FROM   Likes INNER JOIN 
         Resources ON Likes.resourceID = Resources.Id 
GROUP BY Resources.Id 

Result 
Count_resID Id 
----------- ----------- 
1   53 
2   54 
2   60 
2   61 
1   62 

(5 row(s) affected) 
SELECT  a.Id, a.summary, a.pageId, a.name, a.createdOn, COUNT(Likes.resourceID) AS Count_resID 
FROM   Resources AS a INNER JOIN 
         Topics_Resources AS b ON a.Id = b.ResourceID INNER JOIN 
         Skills_Resources AS c ON a.Id = c.ResourceID INNER JOIN 
         Types AS d ON a.typeId = d.Id INNER JOIN 
         Modules AS m ON a.ModuleId = m.ModuleID INNER JOIN 
         ContentItems AS ci ON m.ModuleID = ci.ModuleID INNER JOIN 
         Tabs AS t ON t.TabID = ci.TabID INNER JOIN 
         TabModules AS tb ON t.TabID = tb.TabID INNER JOIN 
         Likes ON a.Id = Likes.resourceID LEFT OUTER JOIN 
         HtmlText AS h ON tb.ModuleID = h.ModuleID 
GROUP BY a.Id, a.summary, a.pageId, a.name, a.createdOn 
Id   summary        pageId               name   createdOn     Count_resID 
----------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
53   jihuih        http://localhost/ideapark/testpage99.aspx      jklhjk   2013-05-10 07:24:21.833 12 
54   1         http://localhost/ideapark/testpage33.aspx      sdvs   2013-05-09 07:24:21.833 2 
60   sdvsdv        http://localhost/ideapark/tesCreatedate.aspx      dsvsdv   2013-05-13 07:32:13.133 8 
61   newtest        http://localhost/ideapark/newtest.aspx       newTest  2013-05-13 10:35:08.027  2 
62   sdvsdvds        http://localhost/ideapark/page21.aspx       svdsvs  2013-05-14 14:06:15.603  35 

(5 row(s) affected) 

답변

1

여러 테이블을 조인하고 있으며이 테이블 중 둘 이상에 1-n 관계가 있습니다. 당신은 당신이 그것을 기대하지 않는 데카르트 제품을 얻고 있습니다.

올바른 방법은 가입하기 전에 요약하기 위해 하위 쿼리를 수행하는 것입니다.

그러나 count(distinct)을 사용하면 빠르고 쉽게 해결할 수 있습니다. 대신 select 문을 사용

SELECT  a.Id, a.summary, a.pageId, a.name, a.createdOn, 
      COUNT(distinct Likes.Id) AS Count_resID; 

을이 likes의 각 레코드가 고유하게 식별하는 id이 있다고 가정합니다. NumLikes를 참조 다음

    . . . 
        TabModules AS tb ON t.TabID = tb.TabID INNER JOIN 
        (select l.resourceId, count(*) as NumLikes 
        from Likes l 
       ) l ON a.Id = l.resourceID LEFT OUTER JOIN 
        . . . 

과 :

    TabModules AS tb ON t.TabID = tb.TabID INNER JOIN 
        Likes ON a.Id = Likes.resourceID LEFT OUTER JOIN 

같은 사람 :

(이 쿼리가 다시 사용됩니다 특히 경우)를 해결하기 위해 더 나은 방법은 from을 변경하면에서 조인 포함 select 절에 있습니다.

+0

감사합니다. –

1

까지 당신이 당신의 테이블을 조인하는 데 사용하는 기준 중 하나에 문제가 변경합니다. 조인 테이블은 모두 기본 테이블과 1 : 1 비율을 유지해야합니다.

관련 문제