2017-04-11 8 views
3

私は3つのテーブルを持っていますが、3番目のテーブルのwhereステートメントを使用しても3番目のテーブルにはありません。私は左の結合を使用していますが、最初と2番目のテーブルから行を返します。上記のデータから今CI MySQLクエリ結合テーブルとwhere文がすべての行を返さない

Table 1 
+---------+--------------+----------+ 
| acc_PID | acc_name  | acc_type | 
+---------+--------------+----------+ 
|  1 | Account 1 | 1  | 
|  2 | Account 2 | 1  | 
|  3 | Account 3 | 2  | 
|  4 | Account 4 | 1  | 
+---------+--------------+----------+ 

Table 2 
+-------------+-----------------+-----------+ 
| journal_PID | journal_account | trans_PID | 
+-------------+-----------------+-----------+ 
|  1  |  1  |  1  | 
|  2  |  2  |  2  | 
|  3  |  1  |  3  | 
+-------------+-----------------+-----------+ 

Table 3 
+-----------+----------------+ 
| trans_PID | trans_location | 
+-----------+----------------+ 
|  1  |  1  | 
|  2  |  1  | 
|  3  |  2  | 
+-----------+----------------+ 

// CI query 
$this->db->join('table_2 b', 'a.acc_PID = b.journal_account', 'LEFT'); 
$this->db->join('table_3 c', 'b.trans_PID = c.trans_PID', 'LEFT'); 
$this->db->where('a.acc_type', '1'); 
$this->db->where('c.trans_location', '1'); 
$this->db->group_by('a.acc_PID'); 
$query = $this->db->get('table_1 a'); 
$result = $query->result(); 

、私が使用している場合(ます$ this-> DB->( 'c.trans_location'、 '1')ここで)何があるとして、結果はアカウント4を返さないではないだろうtable_2とtable_3のacc_PID = '4'のデータですが、テーブル2とテーブル3にアカウント4のデータがなくても$ this-> db-> where( 'c .trans_location '、' 1 ')、結果はアカウント4も表示されますが、where join文を使用すると、左結合を使用してもテーブル1から行が返されません。

ありがとうございます。

+1

where節の代わりにjoinで条件を追加してみます。 –

+0

これはあなたを助けるかもしれないhttp://stackoverflow.com/questions/15992236/codeigniter-join-with-multiple-conditions –

+0

@AmiteshKumar愚かな私!ありがとうございました。私は答えとして受け入れることができるように、あなたの答えを書いてください。 – Charas

答えて

3

where節の代わりにJoinに条件を追加してみます。 where句に条件を記述すると、フィルタ後にフィルタがフィルタリングされた後に条件が追加されます。

または最後に条件を追加しないでください。

もう1つは、テーブル1とタイル2またはテーブル3の関係が見つかりませんでした。journal_accountはテーブル1との関係です。

私は、これは私が考える解決策である私の自己、それを試してみてください。

SELECT * FROM `table1` 

INNER JOIN table2 ON table2.journal_account = table1.acc_PID 

INNER JOIN table3 ON table3.trans_PID = table2.trans_PID 

WHERE table1.acc_type = 1 AND table3.trans_location = 1 GROUP BY table1.acc_PID 

もこの:

SELECT * FROM `table1` 

INNER JOIN table2 ON table2.journal_account = table1.acc_PID 

INNER JOIN table3 ON table3.trans_PID = table2.trans_PID AND table3.trans_location = 1 

WHERE table1.acc_type = 1 GROUP BY table1.acc_PID 

これは私の2 Accoun Account1を与え、2

を占めることになりますこれがあなたを助けることを願っています。

+0

ありがとうございました。関係はtable_2.journal_accountからtable_1.acc_PIDまでですので、$ this-> db-> join(table_3 c '、' b、trans_PID = c.trans_PIDとc.trans_location = 1 ')となるようにANDを追加しました。左結合を使用しない場合は、表2と3の関係を持たないアカウント4は返されません。左を使用する場合はアカウント4が返されますが、表3の結果も '1以外のtrans.location ' – Charas

+0

@Charas私は自分の答えに質問を追加しました。 –

+0

ありがとうございます、あなたのコードが完璧に正常に動作し、私の結果がtable_3のすべてのデータを返すようになったことが分かりました。(SUM(table_3 bla blacとcase_whoとtransaction_location = 1を追加するのを忘れた場合)。あなたの助けにたくさん。 – Charas

関連する問題