解决mysql查询

解决mysql查询,mysql,Mysql,今天一位面试官问了我一个问题,他说 我们有三个表,分别命名为表A、B和C 那些桌子是这样的 A B C ------------------ -------------------------- ---------------------------- | ID | ProjectID | | ID | LocationID | aID | | ID | points

今天一位面试官问了我一个问题,他说 我们有三个表,分别命名为表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    |
                    --------------------------   ----------------------------
SELECT ID from A where projectID  = 15
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))
现在他让我写一个查询,对那些项目为15的地点的点进行求和

首先,我编写了查询以从表A中获取ID,如下所示

       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    |
                    --------------------------   ----------------------------
SELECT ID from A where projectID  = 15
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))
然后我将这个结果传递到表b查询中,如下所示

       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    |
                    --------------------------   ----------------------------
SELECT ID from A where projectID  = 15
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))
然后我计算这些位置的和,就像这样

       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    |
                    --------------------------   ----------------------------
SELECT ID from A where projectID  = 15
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子句会减慢整个过程,就像我们有数千条记录一样。 然后他又给了我一次机会复习我的答案,但我想不出来

是否有任何方法来优化这一点,或者是否有其他方法来实现同样的效果。
有什么帮助吗?谢谢

试试这个,它可能会解决你的问题

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

试试这个……我希望它能起作用

 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

您尝试过联接吗?您正在编写3个查询,而您可以使用联接编写一个查询。我尝试过这一操作,但这会进入无限循环,因为它一直在说“处理”、“处理”和“处理”。它不会在0.0000的0.0010秒内为您提供246631作为输出,因为我已使用您提供的数据在我的系统中进行了检查。请在你这边检查。是的,这是我这边的一个错误。谢谢,这对我有用。还有瓦姆希的回答。我对两个答案都投了赞成票,但没有接受任何答案,因为我不能接受。再次感谢汉克斯!这对我很有效,也是Manoj Sharma的答案。我应该接受谁的回答?对我来说很难这是你的愿望你觉得很简单你可以接受这个答案