2017-12-07 9 views
0

私は3つのテーブルを持っています。テーブル間の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 

第三表(命名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 

すべてのユーザーベースの合計を知りたいdは次のような取引になります:

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行を与えるが、私は、これらの2つの異なるトランザクションのログの合計のみを検索したいと考えています。

+0

テーブル間に関係はありますか?たとえば、トランザクションテーブルにuser_id列がないとわかります。 – jarlh

+0

@jarlhはいidは他のテーブルのuser_idですので、すべてのトランザクションのログのすべてのユーザーの合計を知っている3つのテーブル間で結合されます – MrRobot

+0

クエリの列名がサンプルの列名と一致しませんデータ。努力をして、それが一貫していることを確認してください。サンプルデータと期待される結果が一致する必要があります。どこにでも同じ名前があります。 – jarlh

答えて

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句に移動されることに注意してください。 JOINLEFT 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を含んでどのように

+0

答えをありがとう、それはうまくいくようです! – MrRobot

1

。だから、私はそれを含めた。ユーザーがログを持っていない場合、これはSUMに対して0を返します。これがあなたが望むものだと思っています