具有多对多内连接的聚合函数

时间:2013-06-20 14:03:53

标签: mysql sql

我有一个foo表,它与BAR表有一对多的关系。 FOO与QUX也有多对多的关系。

举例说明:

FOO
+--------+
| fid    | 
+--------+
|    1   |
|    2   |
|    3   |
|    4   |
+--------+


BAR
+------+-------+-----+
| bid  | cost  | fid |
+------+-------+-----+
|    1 |     2 |  1  |  
|    2 |     4 |  1  |
|    3 |     8 |  2  |
|    4 |    42 |  3  |
|    5 |    21 |  3  |
|    6 |     5 |  4  |
|    7 |    98 |  2  |
|    8 |    30 |  4  |
+------+-------+-----+

FOOQUX
+------+------+
| fid  | qid  |
+------+------+
|    1 |    2 |
|    2 |    1 |
|    2 |    3 |
|    4 |    1 |
+------+------+

QUX
+------+
| qid  |
+------+
|    1 |
|    2 | 
|    3 |
|    4 |
+------+

现在我想为每个FOO条目计算BAR.cost的总和,但是我希望按照“FOO与QUX的任何元素有关联”的方式按QUX过滤

我尝试使用这句话:

SELECT fid, sum(cost)
FROM FOO
INNER JOIN BAR on BAR.fid = FOO.fid
LEFT JOIN FOOQUX ON FOOQUX.fid = FOO.fid

但是这会为FOOQUX中的每个FOO实例返回一个条目,所以在fid = 2(它有两个与之关联的QUX)的情况下,我们的成本会比实际成本加倍。

也许这是一个简单的问题,但我正在努力解决它。

1 个答案:

答案 0 :(得分:1)

我认为这会对你有所帮助。 foo.fid分组将保证每个foo记录只出现一次其条形成本的总和。 Having过滤聚合记录:仅当FOOQUX表包含其fid时才会返回记录。

SELECT fid, SUM(cost)
FROM foo JOIN bar on bar.fid=foo.fid
GROUP BY foo.fid
HAVING foo.fid IN (SELECT fid FROM FOOQUX)