MySql通过其他列上的不同初始值进行聚合

MySql通过其他列上的不同初始值进行聚合,mysql,sql,Mysql,Sql,我有一个表结构如下 | user_id | value | date | |---------|-------|------------| | 1 | 5 | 2017-09-01 | | 2 | 6 | 2017-09-01 | | 1 | 1 | 2017-09-02 | | 1 | 2 | 2017-09-03 | | 2 | 9 | 2017-09-02 | | 1

我有一个表结构如下

| user_id | value | date       |
|---------|-------|------------|
| 1       | 5     | 2017-09-01 |
| 2       | 6     | 2017-09-01 |
| 1       | 1     | 2017-09-02 |
| 1       | 2     | 2017-09-03 |
| 2       | 9     | 2017-09-02 |
| 1       | 3     | 2017-09-04 |
| 2       | 5     | 2017-09-04 |
| 2       | 5     | 2017-09-05 |
| 1       | 1     | 2017-09-05 |
| 1       | 5     | 2017-09-06 |
| 1       | 6     | 2017-09-07 |
| 1       | 3     | 2017-09-08 |
| 1       | 4     | 2017-09-09 |
| 2       | 6     | 2017-09-06 |
| 1       | 1     | 2017-09-10 |
我还有一个表,其中给出了用户ID的初始截止日期,如下所示

| user_id | date       |
|---------|------------|
| 1       | 2017-09-04 |
| 2       | 2017-09-05 |
所有用户的最终截止日期为2017-09-08

我想获得按用户id聚合的值的总和

我试过的是

SELECT user_id, SUM(value) as Total 
FROM table 
WHERE date >= $DATE and date <= '2017-09-08'
GROUP BY user_id

假设您有作为用户和截止点的表名。具有每个用户的截止日期的截止日期。试试这个,让我知道它是否有效

select u.user_id,sum(u.value) Total 
from users u join cutoff c on u.user_id=c.user_id and (u.date>=c.date and u.date<='2017-09-08') 
group by u.user_id
在存在的地方使用

SELECT a.user_id, SUM(a.value) as Total 
FROM table1 a
WHERE EXISTS (
  SELECT 1
  FROM table2 b
  WHERE a.user_id = b.user_id 
  AND a.date >= b.date and a.date <= '2017-09-08'
)
GROUP BY user_id
或者使用条件聚合

SELECT a.user_id,
SUM(CASE WHEN a.date >= b.date and a.date <= '2017-09-08' 
    THEN a.value 
    ELSE 0 
    END) as Total 
FROM table1 a
JOIN table2 b ON a.user_id = b.user_id
GROUP BY user_id

相关子查询在MySQL中实现得不是很好,连接几乎总是首选的。在这种情况下不是这样。子查询非常简单。做一个1:M的样本对性能不太有利。预期答案应如问题18、11所述。从这个查询中我得到了23,11@JayChakra我的错,这是表b列的错位,现已更正
SELECT a.user_id, SUM(a.value) as Total 
FROM table1 a
WHERE EXISTS (
  SELECT 1
  FROM table2 b
  WHERE a.user_id = b.user_id 
  AND a.date >= b.date and a.date <= '2017-09-08'
)
GROUP BY user_id
SELECT a.user_id,
SUM(CASE WHEN a.date >= b.date and a.date <= '2017-09-08' 
    THEN a.value 
    ELSE 0 
    END) as Total 
FROM table1 a
JOIN table2 b ON a.user_id = b.user_id
GROUP BY user_id