我在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 |
+--------------+
答案 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');