[英]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 JOIN
比RIGHT 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.