2014-02-12 64 views
2

我有一個現有的Web應用程序,我從表'用戶'返回用戶詳細信息,並從表'programme_results'的用戶測試結果。完全外部加入CodeIgniter與活動記錄

(用戶)

|email|client_id| 
|[email protected]|1| 
|[email protected]|2| 
|[email protected]|1| 

(programme_results)

|email|client_id|prog_id| 
|[email protected]|1|3| 
|[email protected]|1|3| 
|[email protected]|1|3| 

兩個表都有一個 '電子郵件' 列和兩個表中一 '的client_id' 列,然後在一個 'prog_id' 列結果表。無論電子郵件列中是否存在匹配項,我都需要返回來自'兩個'表的所有行,但是如果'匹配'則匹配值。

我認爲這將是通常所說的「完全外連接」,但我沒有在CodeIgniter Active Record支持的文檔中看到任何提及。 :(

目前,我有我的活動記錄查詢大致爲如下:

$this->db->select('u.email AS user_email, u.client_id AS user_client_id, r.email AS result_email, r.client_id AS result_client_id'); 
$this->db->from('programmes_results r'); 
$this->db->join('users u', 'u.email=r.email', 'left outer'); 
$this->db->where('r.client_id', 1); 
$this->db->where('r.prog_id', 3); 
$query = $this->db->get(); 

產生:

SELECT u.email AS user_email, u.client_id AS user_client_id, r.email AS result_email, r.client_id AS result_client_id FROM programmes_results r LEFT OUTER JOIN users u ON u.email=r.email WHERE r.client_id=1 AND r.prog_id=3 

但是這給了我一個結果集如下,其中它的匹配用戶無需採取任何'他們的'client_id值的通知:

|user_email|user_client_id|result_email|result_client_id| 
|[email protected]|130|[email protected]|1| 
|NULL|NULL|[email protected]|1| 
|[email protected]|2|NULL|NULL| 

此外,更重要的是它不是t在'programmes_results'中沒有匹配的電子郵件地址的情況下返回'users'的值。我想要結束的是:

|user_email|user_client_id|result_email|result_client_id| 
|[email protected]|130|[email protected]|1| 
|NULL|NULL|[email protected]|1| 
|[email protected]|1|NULL|NULL| 

:?

+0

你得到這個工作?如果不是,我可能會爲你刺傷它。 – seangates

回答

0

我相信你可以使用這個期望的影響:

$query = $this->db->select('u.email AS user_email, u.client_id AS user_client_id, r.email AS result_email, r.client_id AS result_client_id') 
->from('programmes_results r') 
->join('users u', 'u.email=r.email', 'left outer') 
->where('r.client_id', 1) 
->where('r.prog_id', 3) 
->where('u.client_id IS NOT NULL') 
->get(); 

將生產SQL等於:

SELECT 
    u.email AS user_email, 
    u.client_id AS user_client_id, 
    r.email AS result_email, 
    r.client_id AS result_client_id 
FROM 
    programmes_results r 
LEFT OUTER JOIN 
    users u ON 
     u.email=r.email 
WHERE 
    r.client_id = 1 AND 
    r.prog_id = 3 AND 
    u.client_id IS NOT NULL