使用Active Record在CodeIgniter中完全外部加入

时间:2014-02-12 00:08:15

标签: mysql sql codeigniter

我有一个现有的Web应用程序,我从表'users'返回用户详细信息,用户测试表'programme_results'的结果。

(用户)

|email|client_id|
|A@example.com|1|
|B@example.com|2|
|C@example.com|1|

(programme_results)

|email|client_id|prog_id|
|A@example.com|1|3|
|B@example.com|1|3|
|D@example.com|1|3|

两个表在两个表中都有一个'email'列和一个'client_id'列,然后在结果表中有一个'prog_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|
|A@example.com|130|A@example.com|1|
|NULL|NULL|D@example.com|1|
|B@example.com|2|NULL|NULL|

另外,更重要的是,如果“programmes_results”中没有匹配的电子邮件地址,则不会返回“用户”的值。我最终想要的是:

|user_email|user_client_id|result_email|result_client_id|
|A@example.com|130|A@example.com|1|
|NULL|NULL|D@example.com|1|
|C@example.com|1|NULL|NULL|

1 个答案:

答案 0 :(得分: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