【问题标题】:Full Outer Join in CodeIgniter with Active Record使用 Active Record 在 CodeIgniter 中进行完全外部联接
【发布时间】:2014-03-10 01:42:18
【问题描述】:

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

(用户)

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

(program_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|

:?

【问题讨论】:

  • 你搞定了吗?如果没有,我可能会为你试一试。

标签: mysql sql codeigniter


【解决方案1】:

我相信你可以通过使用这个来获得想要的效果:

$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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2011-10-22
    • 2021-11-17
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多