1

我目前在尝试选择作业在 tbl_jobs 表中列出的位置并且尚未使用 NOT IN 子查询分配给 tbl_delivery_items 表中的交付项目时遇到问题。

子查询应返回supplier_job_job_id 1(当您将其作为单独的查询运行时它会返回),其中NOT IN 排除了id 为1 的作业。唉,它不起作用并通过返回带有a 的作业使我头疼当我期待一个空集时,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

有任何想法吗?

4

3 回答 3

2

问题是子查询被呈现为字符串。您可以在您提供的生成查询中清楚地看到这一点。

这似乎是where_not_inCodeIgniter 方法的一个限制。一个可能的解决方案,更改代码以调用该where方法并自己呈现查询的稍大部分:

$this->db->where("supplier_job_job_id NOT IN (SELECT delivery_item_job_id FROM tbl_delivery_items)");
于 2014-08-19T19:57:00.767 回答
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 JOINtotbl_delivery_items和 .. 的WHERE条件,delivery_item_job_id IS NULL这在您的框架中应该相当容易。

于 2014-08-19T19:53:11.420 回答
1

您的子选择正在作为字符串输出。请注意,它在结果查询中使用单引号。那当然行不通。

我实际上会在这里质疑您的预期方法。随着您的tbl_delivery_items表变得越来越大,您的查询将变得越来越慢。这不是一种可扩展的方法。您应该重新访问您的表模式并获得一种更直接的方式来标记已完成的交付。

于 2014-08-19T19:53:30.023 回答