我在尝试选择tbl_jobs表中列出作业的位置并且尚未使用NOT IN子查询分配到tbl_delivery_items表中的交付项目时遇到问题。
子查询应该返回supplier_job_job_id 1(当你将其作为单独的查询运行时它会执行),NOT IN排除id为1的作业。唉,它不起作用并且让我头疼回来当我期待一个空集时,job_id为1的作业。以下是生成查询的codeigniter代码:
$this->db->join("tbl_jobs", "tbl_jobs.job_id = tbl_supplier_jobs.supplier_job_job_id");
$this->db->where_not_in("supplier_job_job_id", "SELECT delivery_item_job_id FROM tbl_delivery_items");
$result = $query->result_array();
echo $this->db->last_query();
return $result;
以下是它生成的查询:
SELECT * FROM (`tbl_supplier_jobs`) JOIN `tbl_jobs` ON `tbl_jobs`.`job_id` = `tbl_supplier_jobs`.`supplier_job_job_id` WHERE `supplier_job_job_id` NOT IN ('SELECT delivery_item_job_id FROM tbl_delivery_items') AND `supplier_job_supplier_id` = '1' ORDER BY `tbl_jobs`.`job_number` DESC
以下是数据:
tbl_supplier_jobs
supplier_job_id | supplier_job_job_id | supplier_job_supplier_id
1 1 1
2 2 2
tbl_jobs
job_id | job_number | job_description | job_delivered
1 1024 aaaaa 0
2 2048 bbbbb 0
tbl_delivery_items
delivery_item_id | delivery_item_delivery_id | delivery_item_job_id | delivery_item_toa | delivery_item_pallet_quantity | delivery_item_box_quantity
1 1 1 2014-08-18 16:23:04 2 1
有什么想法吗?
答案 0 :(得分:2)
问题是子查询是以字符串形式呈现的。您可以在提供的生成查询中清楚地看到这一点。
这似乎是CodeIgniter的where_not_in
方法的限制。一个可能的解决方案,更改代码以调用where
方法并自己渲染查询的稍大部分:
$this->db->where("supplier_job_job_id NOT IN (SELECT delivery_item_job_id FROM tbl_delivery_items)");
答案 1 :(得分:1)
查询没有使用字符串值执行子查询:
`supplier_job_job_id` NOT IN (
'SELECT delivery_item_job_id FROM tbl_delivery_items'
)
将检查supplier_job_job_id
是否等于字符串'SELECT delivery_item_job_id FROM tbl_delivery_items'
。
您应该考虑LEFT JOIN
到tbl_delivery_items
以及WHERE
的{{1}}条件......这在您的框架中应该相当容易。
答案 2 :(得分:1)
您的子选择输出为字符串。请注意,它在结果查询中使用单引号。那当然行不通。
我实际上会在这里质疑你想要的方法。随着您的tbl_delivery_items
表变得越来越大,您的查询将越来越慢。这不是一种可扩展的方法。您应该重新访问表模式,并以更直接的方式标记已完成的交付。