您好数据库专家。我的 MySQL 查询有一个小问题,其中一个字段可以返回NULL 如果它返回 NULL,即使该记录应该存在,整个记录也不会出现。
查询是:
SELECT
`job_status_update`.`job_status_id` AS `last_job_status_id`,
`job_status`.`status_name` AS `last_status_name`,
`job_report`.`id` AS `job_report_id`,
`job_report`.`start_time`,
`job_report`.`form_number`,
`job_report`.`activity`,
`job_report`.`end_time`,
`job_report`.`date_added` AS `reported_date`,
`job_report`.`omc_site_manager_signature`,
`omc`.`name` AS `omc`,
`assigned_job`.`date_added` AS `date_assigned`,
`job`.`id` AS `job_id`,
`job_category`.`category_name` AS `job_category_name`,
`job`.`date_received`,
`job`.`work_order_number`,
`job`.`job_description`,
`job`.`omc_site_name`, `job`.`deadline`,
`equipment`.`name` AS `equipment_name`,
`reported_faulty_equipment`.`fault`,
`reported_faulty_equipment`.`root_cause`,
`reported_faulty_equipment`.`solution`
FROM `job_report`
INNER JOIN `assigned_job` ON `job_report`.`assigned_job_id` = `assigned_job`.`assigned_job_id`
INNER JOIN `job` ON `assigned_job`.`job_id` = `job`.`id`
LEFT JOIN `job_status_update` ON `job_status_update`.`job_id` = `assigned_job`.`job_id`
LEFT JOIN `job_status` ON `job_status_update`.`job_status_id` = `job_status`.`id`
INNER JOIN `reported_faulty_equipment` ON `reported_faulty_equipment`.`job_report_id` = `job_report`.`id`
INNER JOIN `equipment` ON `equipment`.`id` = `reported_faulty_equipment`.`equipment_id`
INNER JOIN `job_category` ON `job`.`job_category_id` = `job_category`.`id`
INNER JOIN `omc` ON `job`.`omc_id` = `omc`.`id`
WHERE `job_report`.`id` = 6
AND `job_status_update`.`id` = (SELECT MAX(`job_status_update`.`id`) AS `last_job_status_update` FROM `job_status_update`)
我意识到查询的违规部分在于 WHERE 子句。
AND `job_status_update`.`id` = (SELECT MAX(`job_status_update`.`id`) AS `last_job_status_update` FROM `job_status_update`)
因为job_status_update
. id
因此NULL
,如果“作业”没有“作业状态更新”,则查询不会返回一行。
请问我如何返回记录,即使job_status_update
。id
一片空白?我已经看到了使用该IF...ELSE
语句的示例。但我无法取得任何进展。
EXPLAIN
输出:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY job_report const PRIMARY,assigned_job_id,fk_Job_Report_Job_Report_1 PRIMARY 4 const 1
1 PRIMARY assigned_job const PRIMARY,job_id,fk_Assigned_Jobs_Job_1 PRIMARY 4 const 1
1 PRIMARY job const PRIMARY,fk_Job_Job_Category_2,fk_Job_Omc_id PRIMARY 4 const 1
1 PRIMARY job_status_update const PRIMARY,job_id PRIMARY 4 const 1
1 PRIMARY job_status const PRIMARY PRIMARY 4 const 1
1 PRIMARY job_category const PRIMARY PRIMARY 4 const 1
1 PRIMARY omc const PRIMARY PRIMARY 4 const 1
1 PRIMARY reported_faulty_equipment ref job_report_id,fk_Faulted_Equipment_Job_Report_1,eq... job_report_id 4 const 2
1 PRIMARY equipment eq_ref PRIMARY PRIMARY 4 resl_v2.reported_faulty_equipment.equipment_id 1
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
我知道您想返回行,如果
job_status_update.id
是NULL
并且MAX(job_status_update.id)
也是NULL
- 正确吗?如果是这样,这是 MySQL 中的语法:运算符的
<=>
工作方式类似=
,除了NULL <=> NULL
返回1
。前段时间我写了一篇关于如何
NULL
在 SQL 中编写比较的文章。我不想发送垃圾邮件,但由于它与您的问题有关,您可能会发现它很有用:MariaDB、PostgreSQL 和 SQLite 中的 NULL 比较。请注意,MariaDB 在这方面的工作方式与 MySQL 完全一样。一个简单的选择似乎是将有问题的条件从连接定义
WHERE
的ON
子句中移出job_status_update
,以便代替你最终会得到
这样,
`job_status_update`.`id`
过滤器将仅适用于job_status_update
表,而不适用于整个连接结果集。请注意,
MAX
在这种情况下不需要对列进行别名,因此您也可以编写在最列表中,这样您的输出行不会因为
MAX
子查询返回的空值而被消除,但同时我并不完全确定子查询是否会按您期望的方式工作。子查询只会返回最后一个id
值,job_status_update
而没有任何进一步的限定,我偷偷怀疑你实际上想要给定的最后id
一个值job_id
。如果是这种情况,您可以像这样进一步修改加入条件:但是当然我可能是错的,在这种情况下,请忽略最后一个建议。