我有一个现有的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|
:
答案 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