SQL右表连接

时间:2017-12-07 10:44:53

标签: mysql sql

我有三个表,我想在它们之间执行连接。

第一个表看起来像(命名用户)

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行,这是正确的,但现在我想只找到这两个不同交易中的日志总和。

2 个答案:

答案 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 JOINRIGHT 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。我认为这是你想要的