CodeIgniter中具有多个条件的SQL INNER JOIN

时间:2019-01-25 04:32:13

标签: mysql sql codeigniter

我有下表。

------------------------------------
| card_no          | approval_code |
------------------------------------
| 999999xxxxxx1234 | 111111        |
 ----------------------------------
| 888888xxxxxx5678 | 222222        |
------------------------------------
| 777777xxxxxx9012 | 333333        |
 -----------------------------------
| 666666xxxxxx3456 | 444444        |
 -----------------------------------

交易

---------------------------------------------
| trans_id | pan   | approval code  | amount |
---------------------------------------------
| A1       | 9012  | 333333         |     9.9|
----------------------------------------------
| A2       | 9012  | 333333         |    10.0|
----------------------------------------------
| B1       | 1233  | 111111         |    11.0|
----------------------------------------------
| B2       | 1234  | 111111         |    12.0|
----------------------------------------------
| C1       | 5678  | 222222         |    13.0|
----------------------------------------------
| C2       | 5678  | 444444         |    13.0|
----------------------------------------------

我的输出是显示3种类型的输出。 第一个输出显示匹配的数据,第二个输出显示卡表中的不匹配数据,第三个输出显示事务表中的不匹配数据。以下是我的代码。交易记录表仅存储平移(card_no的最后4位数字),因此我需要按一下以获取最后4位数字。

用于匹配的数据:

$query = $this->db->select (array(
'c.card_no', 'c.approval_code',
't.trans_id','t.pan','t.approval_code','amount'
),false)
-> join('transactions t','t.approval_code = c.approval_code','inner')
-> join('transactions t','t.pan = substr(c.card_no,12)','inner')
-> get('cards c');

用于卡片表中不匹配的数据;

$query = $this->db->select (array(
'c.card_no', 'c.approval_code',
't.trans_id','t.pan','t.approval_code','amount'
),false)
-> join('transactions t','t.approval_code != c.approval_code','inner')
-> join('transactions t','t.pan != substr(c.card_no,12)','inner')
-> where ('t.approval_code' IS NULL,NULL,FALSE)
-> where ('t.pan' IS NULL,NULL,FALSE)
-> get('cards c');

用于交易表中不匹配的数据;

$query = $this->db->select (array(
'c.card_no', 'c.approval_code',
't.trans_id','t.pan','t.approval_code','amount'
),false)
-> join('cards c','t.approval_code = c.approval_code','inner')
-> join('cards c','t.pan != substr(c.card_no,12)','inner')
-> where ('c.approval_code' IS NULL,NULL,FALSE)
-> where ('c.card_no' IS NULL,NULL,FALSE)
-> get('cards c');

两者似乎都不起作用..嗯 我的预期输出是:

输出匹配的数据

--------------------------------------------------------
| card_no          | approval_code | trans_id | amount |
--------------------------------------------------------
| 999999xxxxxx1234 | 111111        | B2       | 12.0   |
 -------------------------------------------------------
| 888888xxxxxx5678 | 222222        | C1       | 13.0   |
--------------------------------------------------------
| 777777xxxxxx9012 | 333333        | A1       | 9.9    |
 -------------------------------------------------------
| 777777xxxxxx9012 | 333333        | A2       | 10.0   |
 -------------------------------------------------------

从桌卡中输出不匹配的数据

------------------------------------
| card_no          | approval_code |
------------------------------------
| 666666xxxxxx3456 | 444444        |
 -----------------------------------

从表事务中输出不匹配的数据

---------------------------------------------
| trans_id | pan   | approval code  | amount |
---------------------------------------------
| B1       | 1233  | 111111         |    11.0|
----------------------------------------------
| C2       | 5678  | 444444         |    13.0|
----------------------------------------------

1 个答案:

答案 0 :(得分:0)

要从cards表中获取不匹配的数据,请将join替换为right join。对于transactions表中不匹配的数据,在各个查询中将join替换为left join