内部连接超过 2 个表

Inner join on more than 2 tables

我有 3 个不同的 tables balancereceivedexpenses,其中包含以下数据。 Table 收到:

mysql> select * from received;
+-----+---------+-----------------+---------------------+
| rid | site_id | received_amount | receive_date        |
+-----+---------+-----------------+---------------------+
|   1 |       1 |             500 | 2015-08-19 18:16:51 |
|   2 |       1 |             600 | 2015-08-19 18:16:52 |                                                                                                                                       
|   3 |       1 |             500 | 2015-08-20 18:16:52 |                                                                                                                                       
|   4 |       1 |             500 | 2015-08-19 18:16:52 |
+-----+---------+-----------------+---------------------+

Table 费用:

mysql> select * from expenses;
+-----+---------+----------------+---------------------+
| eid | site_id | expense_amount | expense_date        |
+-----+---------+----------------+---------------------+
|   1 |       1 |            500 | 2015-08-19 18:17:11 |
+-----+---------+----------------+---------------------+

Table余额:

mysql> select * from balance;
+----------------+---------+---------------+--------------+-----------------+-----------------+------+------+---------------------+
| transaction_id | site_id | account_title | particulars  | opening_balance | closing_balance | rid  | eid  | transaction_date    |
+----------------+---------+---------------+--------------+-----------------+-----------------+------+------+---------------------+
|              1 |       1 | test1         | test1 values |               0 |             500 |    1 | NULL | 2015-08-19 18:16:51 |
|              2 |       1 | test1         | test1 values |             500 |            1100 |    2 | NULL | 2015-08-19 18:16:52 |
|              3 |       1 | test1         | test1 values |            1100 |            1600 |    3 | NULL | 2015-08-20 18:16:52 |
|              4 |       1 | test1         | test1 values |            1100 |            1600 |    4 | NULL | 2015-08-19 18:16:52 |
|              5 |       1 | test1         | test1 values |            1600 |            1100 | NULL |    1 | 2015-08-19 18:17:11 |
+----------------+---------+---------------+--------------+-----------------+-----------------+------+------+---------------------+

我正在尝试使用以下查询将收到的金额和费用合并到余额 table 中,但不知何故我无法获得正确的方法。

select 
      b.transaction_id,
      b.site_id,
      b.account_title,
      b.particulars,
      b.opening_balance,
      r.received_amount,
      e.expense_amount,
      b.closing_balance,
      b.transaction_date 
   from 
      balance b 
         inner join received r 
            on b.site_id = r.site_id 
         inner join expenses e 
            on b.site_id = e.site_id 
   group by 
      b.transaction_id;

我正在尝试获取此输出

+----------------+---------+---------------+--------------+-----------------+-----------------+----------------+-----------------+---------------------+
| transaction_id | site_id | account_title | particulars  | opening_balance | received_amount | expense_amount | closing_balance | transaction_date    |
+----------------+---------+---------------+--------------+-----------------+-----------------+----------------+-----------------+---------------------+
|              1 |       1 | test1         | test1 values |               0 |             500 |            NULL |             500 | 2015-08-19 18:16:51 |
|              2 |       1 | test1         | test1 values |             500 |             600 |            NULL |            1100 | 2015-08-19 18:16:52 |
|              3 |       1 | test1         | test1 values |            1100 |             500 |            NULL |            1600 | 2015-08-20 18:16:52 |
|              4 |       1 | test1         | test1 values |            1600 |             NULL |            500 |            1100 | 2015-08-19 18:16:52 |
|              5 |       1 | test1         | test1 values |            1100 |             500 |            NULL |            1600 | 2015-08-19 18:17:11 |
+----------------+---------+---------------+--------------+-----------------+-----------------+----------------+-----------------+---------------------+

你有点接近。您需要对收据和费用执行 LEFT-JOIN,而不是 INNER JOIN。由于您的 "Balance" table 拥有所有交易,它将驱动它在您的基础支持 table 中看到的条目。另外,不要只加入站点 ID,而只加入 "rID" 和 "eID",因为它们无论如何都是 table 上的主键。

不需要按交易 ID 分组,因为它是余额中的主键 table,而且给定 ID 只会有一个条目。

select 
      b.transaction_id,
      b.site_id,
      b.account_title,
      b.particulars,
      b.opening_balance,
      r.received_amount,
      e.expense_amount,
      b.closing_balance,
      b.transaction_date 
   from 
      balance b 
         LEFT join received r 
            on b.rid = r.rid
            AND b.site_id = r.site_id 
         LEFT join expenses e 
            on b.eid = e.eid
            AND b.site_id = e.site_id 
   order by
      b.site_id,
      b.transaction_date