将三个计数查询合并为一个结果

Combine Three Count Queries to One Result

边学边学,但已经到了自我成长的极限。我希望将以下三个查询显示在一个查询中。但是我迷失在连接和联合的术语中。

SELECT    DID.display as "DisplayID",
          COUNT(AltID.REFID) as "C_AltIDs"
FROM      DID,
          AltID
WHERE     DID.REFID = AltID.REFID
GROUP BY  AltID.REFID, DID.display 
ORDER BY  COUNT(AltID.REFID) desc;


SELECT    DID.display as "DisplayID",
          COUNT(address.REFID) as "C_AltAddresses"
FROM      DID,
          address
WHERE     DID.REFID = address.REFID
GROUP BY  address.REFID, DID.display 
ORDER BY  COUNT(address.REFID) desc;


SELECT    DID.display as "DisplayID",
          COUNT(name.REFID) as "C_AltNames"
FROM      DID,
          name
WHERE     DID.REFID = name.REFID
GROUP BY  name.REFID, DID.display 
ORDER BY  COUNT(name.REFID) desc;



**Desired end result**
|DisplayID|AltIDs|AltAddresses|AltNames|
    01       32        32         2
    02        2        12         4

这肯定会让人感到困惑。当您想将结果(或表格)连接在一起时,可以这样想:

  1. 如果您希望结果在同一行中,则需要 JOIN
  2. 如果您希望结果相互堆叠,则需要 UNION

在您的情况下,您希望它们并排放置,因此您必须将所有这些连接在一起。

SELECT
    t1.display,
    t1.C_AltIDs,
    t2.C_AltAddresses,
    t3.C_AltNames
FROM
    (
        SELECT    DID.display as "DisplayID",
              COUNT(AltID.REFID) as "C_AltIDs"
        FROM      DID,
              AltID
        WHERE     DID.REFID = AltID.REFID
        GROUP BY  DID.display 
    ) t1

    LEFT OUTER JOIN
    (

        SELECT    DID.display as "DisplayID",
              COUNT(address.REFID) as "C_AltAddresses"
        FROM      DID,
              address
        WHERE     DID.REFID = address.REFID
        GROUP BY  DID.display 
    ) t2 ON
        t1.Display = t2.Display

    LEFT OUTER JOIN
    (
        SELECT    DID.display as "DisplayID",
              COUNT(name.REFID) as "C_AltNames"
        FROM      DID,
              name
        WHERE     DID.REFID = name.REFID
        GROUP BY  DID.display 
    ) t3 ON
        t1.Display = t3.Display

我已经从每个子查询中删除了 ORDER BY 子句,因为您不能在子查询中执行 ORDER BY。我还从 GROUP BY 子句中删除了与 COUNT() 聚合的字段,因为如果您想计算它们,将它们放在那里没有多大意义。出于某种原因,MySQL 允许你做这样时髦的事情,即使它是荒谬的,如果你试图 GROUP BY 在你已经在 SELECT 中聚合的字段上,大多数 RDBMS 都会抛出错误条款。

也许使用相关子查询对您有用?

SELECT    
  DID.display as "DisplayID",
  (SELECT COUNT(AltID.REFID) FROM AltID WHERE REFID = DID.REFID) as "C_AltIDs",
  (SELECT COUNT(address.REFID) FROM address WHERE REFID = DID.REFID) as "C_AltAddresses",
  (SELECT COUNT(name.REFID) FROM name WHERE REFID = DID.REFID) as "C_AltNames" 
FROM DID
ORDER BY display 

编辑:评论中要求的附加解决方案:

;WITH x AS (
  SELECT    
    DID.display as "DisplayID",
    (SELECT COUNT(AltID.REFID) FROM AltID WHERE REFID = DID.REFID) as "C_AltIDs",
    (SELECT COUNT(address.REFID) FROM address WHERE REFID = DID.REFID) as "C_AltAddresses",
    (SELECT COUNT(name.REFID) FROM name WHERE REFID = DID.REFID) as "C_AltNames" 
  FROM DID
) 

SELECT *, C_AltIDs+C_AltAddresses+C_AltNames AS SumOfCounts 
FROM x