繁体   English   中英

表之间的SQL右连接

[英]SQL right join between tables

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

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

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 

第三个表看起来像(名为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

因此,这是我希望每次使用都获得其在所有事务中的日志总和的结果。

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

您的查询基本上是正确的,但是您需要聚合:

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直观得多,因为它将所有行保留在第一个表中。

这个怎么样

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。 我想这就是你想要的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM