我有一个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)的情况下,我们的成本会比实际成本加倍。
也许这是一个简单的问题,但我正在努力解决它。
答案 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)