将三个计数查询合并为一个结果
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
这肯定会让人感到困惑。当您想将结果(或表格)连接在一起时,可以这样想:
- 如果您希望结果在同一行中,则需要 JOIN
- 如果您希望结果相互堆叠,则需要 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
边学边学,但已经到了自我成长的极限。我希望将以下三个查询显示在一个查询中。但是我迷失在连接和联合的术语中。
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
这肯定会让人感到困惑。当您想将结果(或表格)连接在一起时,可以这样想:
- 如果您希望结果在同一行中,则需要 JOIN
- 如果您希望结果相互堆叠,则需要 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