查询返回不存在的行

时间:2017-02-01 18:13:29

标签: php mysql codeigniter

我在CodeIgniter中的模型中有这个查询:

function get_licenses_info($id)
    {
        $this->db->select('
            vendors.id as vendors_id,
            vendor_licenses.id as vendor_licenses_id,
            vendor_licenses.vendor_id,
            vendor_licenses.license_type,
            vendor_licenses.date_expires,
            vendor_licenses.license_num
            ');
        $this->db->from('vendors');
        $this->db->join('vendor_licenses', 'vendor_licenses.vendor_id = vendors.id', 'left');
        $query = $this->db->get();
        return $query->result_array();
    }

我认为这段代码:

foreach($licenses as $l)
{   
    echo $l['license_type'];
    if(strtotime($l['date_expires']) < time())
        {
            echo " expired on ".date("M, d, Y", strtotime($l['date_expires']))."<br>";  
        }
    else
    {
        echo "<br>";
    }
}

这是在视图中返回的内容:

Baldwin County
City of Pensacola expired on Jan, 04, 2017
expired on Dec, 31, 1969

我想也许我已经在我的数据库中得到了额外的一行。但我查了一下,而且我只放了两张唱片。所以我想也许这个表是腐败的,删除它并制作了一个新的副本,有2个新记录......同样的问题。 甚至更奇怪,当我删除所有记录时,我没有一个,但两个空白&#39;迭代。 我已经广泛搜索了这个,并且在这种情况下找不到任何,而不是通过搜索CodeIgniter的问题,甚至是一般的mySQL工作。任何建议将不胜感激。

这是vendor_licenses表:

╔════════════════════════════════════════════════════╦══╗
║                                                    ║  ║
╠════════════════════════════════════════════════════╬══╣
║ id vendor_id license_type date_expires license_num ║  ║
║ 1 2 Baldwin County 2017-02-03 NULL                 ║  ║
║ 2 2 City of Pensacola 2017-01-04 NULL              ║  ║
╚════════════════════════════════════════════════════╩══╝

这是供应商表:

+--------------+
| id is_active |
+--------------+
| 1 1          |
| 2 1          |
+--------------+

1 个答案:

答案 0 :(得分:2)

反转JOIN。

你在做:

SELECT fields FROM vendors 
LEFT JOIN vendor_licenses ON vendor_licenses.vendor_id = vendors.id

因此,您为供应商表的每个记录获取一行。但我认为你对于获得供应商id = 1的任何东西都不感兴趣,它在vendor_licenses表中没有任何信息(你得到一个未完全知情的行)。

相反,请尝试:

SELECT fields FROM vendor_licenses 
LEFT JOIN vendors ON vendor_licenses.vendor_id = vendors.id

..以便为每个vendor_license记录获取一行。

或者只是按照原样保留,但不是LEFT,而是直接加入表:

$this->db->join('vendor_licenses', 'vendor_licenses.vendor_id = vendors.id', 'right');