【问题标题】:3 Count functions returning the same value3 计数函数返回相同的值
【发布时间】:2018-08-07 02:15:35
【问题描述】:

所以我有这个查询:

SELECT Posts.[Post ID], Count(Comments.[Comment ID]) AS [CountOfComment ID],
Count(Shares.[Share ID]) AS [CountOfShare ID],
Count(Likes.[Like ID]) AS [CountOfLike ID]

FROM ((Posts INNER JOIN Likes ON Posts.[Post ID] = Likes.[Post ID]) 
INNER JOIN Shares ON Posts.[Post ID] = Shares.[Post ID]) 
INNER JOIN Comments ON Posts.[Post ID] = Comments.[Post ID]

WHERE posts.[post id] = 5 

GROUP BY Posts.[Post ID];

应该返回结果:

post.[post id]= 5 
CountofcommentID= 4
CountofShareID = 5
CountofLikeID = 15 

但我得到的是post.[post id] = 5, and the rest =300.

我知道这是因为它正在计算所有 ID 的所有排列,但是我如何更改它以获得我想要的结果?

【问题讨论】:

  • ms访问还是mysql????
  • 语法明显是MS Access,所以我调整了标签。

标签: sql database ms-access count


【解决方案1】:

您误解了COUNT() 的作用。它计算非NULL 值的数量。正确的解决方案是使用COUNT(DISTINCT)。因为 MS-Access 不支持COUNT(DISTINCT),您可能会将其解释为“获取功能数据库”。

在 MS Access 中,您可以使用某种类型的子查询来执行此操作。这是一种方法:

SELECT p.[Post ID],
       (SELECT COUNT(*)
        FROM (SELECT DISTINCT [Post Id], [Comment ID]
              FROM Comments as c
             ) as c
        WHERE c.[Post Id] = p.[Post Id]
       ) as [CountOfComment ID],
       (SELECT COUNT(*)
        FROM (SELECT DISTINCT [Post Id], [Share ID]
              FROM Shares as s
             ) as s
        WHERE s.[Post Id] = p.[Post Id]
       ) as [CountOfShare ID],
       (SELECT COUNT(*)
        FROM (SELECT DISTINCT [Post Id], [Like ID]
              FROM Likes as l
             ) as l
        WHERE l.[Post Id] = p.[Post Id]
       ) as [CountOfLikes ID]
FROM Posts as p
WHERE p.[post id] = 5 
GROUP BY p.[Post ID];

【讨论】:

    【解决方案2】:

    当您加入时,每个组合都会获得一行。因此,count 确实计算每一行,其值不同于 null。所以,你想要的是计算 DISTINCT id。即:

    SELECT Posts.[Post ID], Count(DISTINCT Comments.[Comment ID]) AS [CountOfComment ID],
    Count(DISTINCT Shares.[Share ID]) AS [CountOfShare ID],
    Count(DISTINCT Likes.[Like ID]) AS [CountOfLike ID]
    
    FROM ((Posts INNER JOIN Likes ON Posts.[Post ID] = Likes.[Post ID]) 
    INNER JOIN Shares ON Posts.[Post ID] = Shares.[Post ID]) 
    INNER JOIN Comments ON Posts.[Post ID] = Comments.[Post ID]
    
    WHERE posts.[post id] = 5 
    
    GROUP BY Posts.[Post ID];
    

    如果系统不支持这种语法,你可能需要做子查询:

    Select Posts.[Post ID], 
       (Select count([Share ID]) from Shares where Posts.[Post ID] = Shares.[Post ID]) as SharesCount
    FROM Posts
    
    WHERE posts.[post id] = 5;
    

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多