解决mysql查询

时间:2015-01-14 10:07:45

标签: mysql

今天我被一位采访者问过一个问题 我们有三个名为表A,B和C的表。

那些表是这样的

       A                        B                             C
------------------  --------------------------   ----------------------------
| ID | ProjectID |  | ID | LocationID |  aID |   | ID | points | LocationID |
------------------  --------------------------   ----------------------------
| 1  |    15     |  | 1  |    131     |   1  |   | 1  | 123333 |     131    |
| 2  |    15     |  | 2  |    132     |   1  |   | 2  | 123223 |     132    |
| 3  |    15     |  | 3  |    133     |   1  |   | 3  | 522    |     211    |
| 4  |    12     |  | 4  |    134     |   2  |   | 4  | 25     |     136    |
------------------  | 5  |    136     |   2  |   | 5  | 25     |     133    |
                    | 6  |    137     |   3  |   | 6  | 25     |     134    |
                    | 7  |    138     |   1  |   | 7  | 25     |     135    |
                    --------------------------   ----------------------------

现在他告诉我写一个查询,该项查询总结项目为15的那些地点的点。

首先,我编写了查询,以便像这样从表A中获取ID

SELECT ID from A where projectID  = 15

然后我将此结果传递给表b查询,就像这样

SELECT LocationID FROM B WHERE aID IN ( SELECT ID from A where projectID  = 15 )

然后我就像这样计算这些位置的总和

SELECT SUM(points) from C where LocationID IN(SELECT LocationID FROM B WHERE aID IN ( SELECT ID from A where projectID = 15))

我的结果很好,查询正确。但他拒绝了我的回答,他说这个嵌套的IN Clause会减慢整个过程,就像我们有数千条记录一样。 然后他给了我另一个机会来回顾我的答案,但我无法理解。

无论如何要优化这个还是有其他方法来做同样的事情。 有帮助吗?感谢

2 个答案:

答案 0 :(得分:1)

试试这可能会解决您的问题。

Select SUM(C.points) FROM C JOIN B ON C.LocationID = B.LocationID JOIN A ON B.aID = A.ID where A.ProjectID = 15 GROUPBY A.ProjectID

答案 1 :(得分:1)

试试这个....我希望它会起作用

 select sum(c.points) as sum_points 
 from A a,B b,C c where 
 a.ID=b.aID and 
 b.LocationID=c.LocationID
 and a.projectID=15