解决mysql查询
今天一位面试官问了我一个问题,他说 我们有三个表,分别命名为表A、B和C 那些桌子是这样的解决mysql查询,mysql,Mysql,今天一位面试官问了我一个问题,他说 我们有三个表,分别命名为表A、B和C 那些桌子是这样的 A B C ------------------ -------------------------- ---------------------------- | ID | ProjectID | | ID | LocationID | aID | | ID | points
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的答案。我应该接受谁的回答?对我来说很难这是你的愿望你觉得很简单你可以接受这个答案