MySQL JOIN 需要附加条件
MySQL JOIN Needs Additional Condition
我有两个 table,一个工作 table 和一个申请人 table。申请人 table 有一个包含申请职位的字段。我的查询似乎很接近,只是它只返回已申请的职位。我想要的是所有活动职位的显示,其中还有一列显示申请人数。有些工作没有申请人,我的查询没有捕获到这些工作。
SELECT * , COUNT(*) as total
FROM `job`
INNER JOIN applicants
ON applicants.position_id=job.id
WHERE active = 'yes'
GROUP BY position_id
ORDER BY title
您需要 left join
和对查询的其他小修复:
SELECT j.*, COUNT(a.position_id) as total
FROM `job` j LEFT JOIN
applicants a
ON a.position_id = j.id
WHERE j.active = 'yes'
GROUP BY j.id
ORDER BY j.title;
变化是:
- 引入了 table 别名(使查询更易于编写和阅读)。
- 对所有列引用使用 table 别名。
- 将
select
更改为 j.*
而不是 *
。由于 group by
. 只有工作信息是合适的
- 已将
group by
更改为 j.id
,因此它永远不会按 NULL
聚合。
- 更改了
count()
以计算匹配项。
正如其他人所提到的,您的联接必须是外部联接。
但是,通过您的简单查询,您可以轻松地 select 仅从作业中获取 select 子句中的应用程序计数。因此,您的查询更具可读性。
select
job.*,
(select count(*) from applicants where position_id = job.id) as total
from job
where active = 'yes'
order by title;
我有两个 table,一个工作 table 和一个申请人 table。申请人 table 有一个包含申请职位的字段。我的查询似乎很接近,只是它只返回已申请的职位。我想要的是所有活动职位的显示,其中还有一列显示申请人数。有些工作没有申请人,我的查询没有捕获到这些工作。
SELECT * , COUNT(*) as total
FROM `job`
INNER JOIN applicants
ON applicants.position_id=job.id
WHERE active = 'yes'
GROUP BY position_id
ORDER BY title
您需要 left join
和对查询的其他小修复:
SELECT j.*, COUNT(a.position_id) as total
FROM `job` j LEFT JOIN
applicants a
ON a.position_id = j.id
WHERE j.active = 'yes'
GROUP BY j.id
ORDER BY j.title;
变化是:
- 引入了 table 别名(使查询更易于编写和阅读)。
- 对所有列引用使用 table 别名。
- 将
select
更改为j.*
而不是*
。由于group by
. 只有工作信息是合适的
- 已将
group by
更改为j.id
,因此它永远不会按NULL
聚合。 - 更改了
count()
以计算匹配项。
正如其他人所提到的,您的联接必须是外部联接。
但是,通过您的简单查询,您可以轻松地 select 仅从作业中获取 select 子句中的应用程序计数。因此,您的查询更具可读性。
select
job.*,
(select count(*) from applicants where position_id = job.id) as total
from job
where active = 'yes'
order by title;