我有三个表,我想在它们之间执行连接。
第一个表看起来像(命名用户)
id column1
1 1
2 2
3 3
第二个表看起来像(命名交易)这里我们有一些用户交易
user_id transaction_date transaction_expire
1 2017-03-31 2017-05-16
1 2017-02-28 2017-04-16
第3个表看起来像(名为user_logs)我们有基于天的用户日志
user_id date some_log_data
1 2017-03-07 1505
1 2017-03-03 1201
1 2017-03-22 942
1 2017-03-31 1490
1 2017-04-05 1490
我想知道基于事务的每个用户的总和:
user_id transaction_date transaction_expire log
1 2017-03-31 2017-05-16 2980
1 2017-02-28 2017-04-16 6628
所以这是我想要在每次使用时实现的结果,在所有事务中获取其日志的SUM。
通过在transaction_date和transaction_expire之间执行此查询,我得到了一些结果但是当我尝试进行求和时,结果是针对所有结果:
SELECT t.transaction_date, t.transaction_expire, ul.log
FROM user_logs as ul
RIGHT JOIN transactions as t ON ul.user_id= t.user_id
WHERE ul.date BETWEEN t.transaction_date AND t.transaction_expire
这个查询给了我7行,这是正确的,但现在我想只找到这两个不同交易中的日志总和。
答案 0 :(得分:1)
您的查询基本上是正确的,但您需要汇总:
SELECT t.transaction_date, t.transaction_expire, SUM(ul.log)
FROM transactions t LEFT JOIN
user_logs ul
ON ul.user_id = t.user_id AND
ul.date BETWEEN t.transaction_date AND t.transaction_expire
GROUP BY t.transaction_date, t.transaction_expire;
另请注意,WHERE
子句中的条件已移至ON
子句。我将JOIN
切换为LEFT JOIN
。我发现LEFT JOIN
比RIGHT JOIN
更直观,因为它会将所有行保留在第一个表中。
答案 1 :(得分:1)
这个怎么样
SELECT t.user_id, t.transaction_date, t.transaction_expire, SUM(IFNULL(ul.log, 0))
FROM user_logs as ul
LEFT JOIN transactions as t ON (ul.user_id= t.user_id AND
ul.date BETWEEN t.transaction_date AND t.transaction_expire)
GROUP BY t.user_id, t.transaction_date, t.transaction_expire;
您的预期结果包含user_id。所以,我把它包括在内。如果用户没有日志,则会为SUM返回0。我认为这是你想要的