MySQL:如何对具有多个条件的联接查询(子查询)求和



我有两个表:

表Y:表示货币在什么时间段内有效

+-----------+---------+------+
| starttime | endtime | name |
+-----------+---------+------+
| 1         | 2       | Mark |
| 3.4       | 3.6     | Fred |
| 2         | 2.2     | Fred |
+-----------+---------+------+

表Z

+-----------+---------+------+-------+
| starttime | endtime | name | money |
+-----------+---------+------+-------+
| 1.5       | 1.7     | Mark | 0.1   |
| 1.4       | 3.5     | Fred | 0.2   |
| 0.9       | 1.0     | Fred | 0.3   |
| 1.2       | 2.5     | Fred | 0.5   |
+-----------+---------+------+-------+

我想要什么:

+------+---------------+
| name | sum_validmoney|
+------+---------------+
| Mark | 0.1           |
| Fred | 0.7           | **=> this is 0.2+0.5 (because those rows overlapped in start/endtime segments)**
+------+---------------+

我希望根据表Y中指示的时间段约束(有界(来汇总表Z中的行。也就是说,要在表Z中求和的行必须具有在表Y中找到的时间段内的时间段(对于其他查询,表Z上也有额外的过滤器;但我认为这与无关(

我是MySQL的新手。我尝试过子查询,但认为我遗漏了一些关键内容;我不确定在没有一些复杂的循环结构的情况下是否可以做到这一点,mysql似乎不具备这些结构。

您似乎希望在范围与表y中至少一个范围重叠的行上筛选表z

如果是这样,一种方法是:

select name, sum(money) sum_valid_money
from z
where exists (
select 1
from y 
where y.name = x.name and y.starttime <= x.endtime and y.endtime >= x.starttime
)
group by name

最新更新