Return 主行 table 如果在加入的 table 中没有找到结果

Return row from main table if no results are found in joined tables

我想编写一个查询,在对其他 2 个 table 进行左连接后,return 主 table 的所有行。在这种情况下,我想 return 所有工作类别并计算该工作类别的重复工作数。如果没有重复出现的作业,则对该列使用 0。

循环作业 table 有一个链接到 job table.

的外键 job_id

目前有 3 个职位类别,例如,如果只有 2 个职位重复出现,则结果中不会显示所有职位类别。

这是我的查询:

SELECT 
jc.category_name, COUNT( NULLIF(jc.id, 0) ) job_category
FROM `job_category` jc
LEFT OUTER JOIN `job` ON `job`.`job_category_id` = jc.id
LEFT OUTER JOIN `recurring_job` rj ON rj.job_id = `job`.`id` AND rj.id IS NOT NULL
WHERE rj.id IS NOT NULL
GROUP BY jc.id;

有人能指出我正确的方向吗?谢谢。

您应该计算 table recurring_job 的第 job_id 列并删除所有条件 rj.id IS NOT NULL:

SELECT jc.id, jc.category_name, 
       COUNT(rj.job_id) counter
FROM job_category jc
LEFT OUTER JOIN job ON job.job_category_id = jc.id
LEFT OUTER JOIN recurring_job rj ON rj.job_id = job.id
GROUP BY jc.id, jc.category_name;

如果idjob_category的PRIMARY KEY(看起来是),你可以从GROUP BY子句中省略category_name

根据您的要求,如果您想要计算不同重复作业的数量,您应该使用:

COUNT(DISTINCT rj.job_id) 

感谢@forpas

在我的案例中不需要 WHERE 子句。

SELECT jc.category_name, 
            COUNT(rj.job_id) count
            FROM `job_category` jc
            LEFT OUTER JOIN `job` ON `job`.job_category_id = jc.id AND `job`.`date_added` BETWEEN '2021-01-01' AND '2021-01-25'
            LEFT OUTER JOIN `recurring_job` rj ON rj.job_id = `job`.id

            GROUP BY jc.id, jc.category_name

这会输出所有列及其对应的重复作业计数。

希望有用。