2013-01-31 122 views
4

我有一个MySQL查询写这个MySQL查询的更好方法是什么?

SELECT *, 
     (SELECT COUNT(*) FROM B WHERE B.AID = A.ID) AS Sum1, 
     (SELECT COUNT(*) FROM C WHERE C.AID = A.ID) AS Sum2 
FROM A 

什么是可能的选择使用连接左右?

+3

这不是'JOIN'-able查询,因​​为这两个数可能不同。 – tadman

+0

考虑以一个sqlfiddle和/或一组DDL的形式提供一个更具体的例子 – Strawberry

回答

2

这会工作。在我的例子中,这些字段被称为ID。

SELECT A.*, 
     COUNT(DISTINCT B.ID) AS Sum1, 
     COUNT(DISTINCT C.ID) AS Sum2 

FROM A 

     LEFT JOIN B ON b.AID = A.ID 
     LEFT JOIN C ON C.AID = A.ID 

GROUP BY A.ID 
+0

这一个似乎相当于我的查询和执行相似。 我只是不明白,MySQL如何计算速度非常快 – brooNo

2
SELECT A.*, IFNULL(t1.sum, 0), IFNULL(t2.sum, 0) 
FROM A 
LEFT JOIN (SELECT AID, COUNT(AID) sum FROM B GROUP BY AID) t1 ON t1.AID = A.ID 
LEFT JOIN (SELECT AID, COUNT(AID) sum FROM C GROUP BY AID) t2 ON t2.AID = A.ID 
+0

你在这里运行很多假设。 – Kermit

+0

这一个工程,但性能较差 – brooNo

0

不知道这是你在找什么,这里是它如何使用join实现:但你assumptions..that表看起来像样我都用作演示。如果不是的话,请与我们与您预期的结果分享你的表模式和样本数据,...如果有在B和C表的唯一ID

http://sqlfiddle.com/#!2/1e65c/2

SELECT A.ID, A.NAME, 
CASE WHEN B.AID = A.ID THEN COUNT(*) END AS SUM1, 
CASE WHEN B.AID = A.ID THEN COUNT(*) END AS SUM1 
FROM A 
INNER JOIN B 
ON A.ID = B.AID 
INNER JOIN C 
ON B.AID = C.AID 
GROUP BY A.ID, A.NAME 
; 

SELECT A.ID, A.NAME, COUNT(B.AID) AS SUM1, 
COUNT(C.AID) AS SUM1 
FROM A 
INNER JOIN B 
ON A.ID = B.AID 
INNER JOIN C 
ON B.AID = C.AID 
GROUP BY A.ID, A.NAME 
; 

| ID | NAME | SUM1 | 
-------------------- 
| 1 | John | 2 | 
| 2 | Tim | 4 | 
| 3 | Jack | 2 | 
相关问题