2013-05-15 4 views
0

Я хочу рассчитать много понравившихся мне сообщений для конкретного поста в моей базе данных Я создал это простое предложение Query. Как у меня есть для одного ресурса «post», но когда я добавляю к основному скрипту, он пропускает его ДополнениеКак посчитать

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 однозначно идентифицировать его.

Лучший способ это исправить (особенно, если этот запрос будет использоваться повторно) предполагает изменение from присоединяется с:

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

Чтобы что-то вроде:

    . . . 
        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 
        . . . 

А потом ссылающийся NumLikes в предложении select.

+0

благодарит вас за консультацию? –

1

Основываясь на изменении результатов, существует проблема с одним из критериев, которые вы используете, чтобы присоединиться к вашим таблицам. Вы должны убедиться, что таблицы в объединении имеют отношение один к одному с базовой таблицей.

Смежные вопросы