我正在努力让我的查询正常工作。基本上,它应该做的只是返回尚未填补的空缺。例如,一个空缺可以有一个预先确定的限制为 5。要填补这个限制,它需要混合 5 个有效或待定预订,或者只需 5 个有效或 5 个待定预订。
当客户接受时,待定预订将变为活动状态。
通过提供我的设置的基本模式可能会有所帮助:-
**tbl.vacancies:**
vacancy_id
job_category_id
business_unit_id
start_date
publication_date
end_date
limit - how many bookings it will accept
**tbl.bookings**
booking_id
candidate_id
vacancy_id
booking_status_id
user_id
date
**btl.booking_status**
id
user_id
booking_status_type_id
date
**tbl.booking_status_type**
id (1,2,3,4)
name (pending, active, rejected, revoked)
当我在 job_category、business_unit、candidate、booking_status 和 booking_status_type 表之间创建内部连接时,我的查询在显示所有空缺时工作正常。
但是我有一个要求,我需要根据是否已满足空缺来显示过滤数据,即它的活动/待定预订少于空缺限制或已被预订满。
我目前使用的查询是:
SELECT v.*, j.job_category_name, bu.business_unit_name
FROM vacancy v
INNER JOIN job_category j ON j.job_category_id = v.job_category_id
INNER JOIN business_unit bu ON bu.business_unit_id = v.business_unit_id
INNER JOIN booking b ON b.vacancy_id = v.vacancy_id
INNER JOIN booking_status bs ON bs.id = b.booking_status_id
WHERE
v.vacancy_status <> 'revoked' AND
v.vacancy_reference <> 'auto-generated booking' AND
v.business_unit_id IN (series of primary keys) AND
(bs.booking_status_type_id = 1 OR bs.booking_status_type_id = 2)
GROUP BY v.vacancy_id
HAVING v.vacancy_limit > count(b.booking_id)
ORDER BY v.vacancy_id DESC
当我撤销预订时出现问题(booking_status_type_id 4)。它似乎弄乱了结果或没有得到任何结果。
预订状态更改的一个小场景可能是:-
- 用户创建预订(待定状态)
- 客户端接受(活动状态)
- 客户端然后决定撤销(撤销状态)
这将导致如下条目:-
Vacancy ID = 100;
Booking ID = 10;
Booking Status entries:-
Booking_id Booking_status_type_id
---------------------------------------
10 1
10 2
10 4
因此,从理论上讲,此预订不应显示在结果中,因为该职位已被删除并再次可用。
这将在 booking_status_type 表中生成 3 个条目,用于预订状态更改。
我不确定为什么我的查询不起作用或者它是否构造正确。作为基本要求,当用户选择是否未填写预订时,它应该只显示预订总和不大于预订限制的空缺。
同样,选择在填充空缺上进行过滤时,只能显示达到限制的空缺。
编辑#1
好的,我已尝试实施建议的解决方案,但无法使其正常工作:
SELECT v.*, j.job_category_name, bu.business_unit_name
FROM vacancy v
INNER JOIN job_category j ON j.job_category_id = v.job_category_id
INNER JOIN business_unit bu ON bu.business_unit_id = v.business_unit_id
INNER JOIN booking b ON b.vacancy_id = v.vacancy_id
INNER JOIN
(SELECT booking_id AS bk_id, max(booking_status_type_id) AS bStatus
FROM booking_status
GROUP BY bk_id
HAVING bStatus < 3) as filter ON filter.bk_id = b.booking_id
WHERE
v.status <> 'revoked' AND
v.reference <> 'auto-generated booking' AND
v.business_unit_id IN (1, 2)
GROUP BY v.vacancy_id
HAVING v.limit > count(b.booking_id)
ORDER BY v.vacancy_id DESC
我收到以下错误:
1064 - 您的 SQL 语法有错误。检查手册
对应于您的 MySQL 服务器版本,以便在 'SELECT booking_id AS bk_id , max( booking_status_type_id ) AS b 附近使用正确的语法
MySQL的版本是4.0