0

我正在努力让我的查询正常工作。基本上,它应该做的只是返回尚未填补的空缺。例如,一个空缺可以有一个预先确定的限制为 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)。它似乎弄乱了结果或没有得到任何结果。

预订状态更改的一个小场景可能是:-

  1. 用户创建预订(待定状态)
  2. 客户端接受(活动状态)
  3. 客户端然后决定撤销(撤销状态)

这将导致如下条目:-

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

4

2 回答 2

0

问题是您忽略了预订状态可能有多个相同预订 ID 的事实,因此您需要首先过滤有效的预订 ID,如下所示

select booking_id as bk_id, max(Booking_status_type_id) status
from booking_status
group by booking_id
having status < 3

此查询将只返回待处理或活动的预订 ID,然后您可以基于此过滤空缺,进一步应用您在您提到的查询中应用的所有联接。我已经粗略地修改了你的查询来做到这一点,检查它是否有效

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) status
from booking_status
group by booking_id
having status < 3) as filter ON filter.bk_id = b.booking_id
WHERE 
    v.vacancy_status <> 'revoked' AND 
    v.vacancy_reference <> 'auto-generated booking' AND 
    v.business_unit_id IN (series of primary keys)
GROUP BY v.vacancy_id 
HAVING v.vacancy_limit > count(b.booking_id)
ORDER BY v.vacancy_id DESC
于 2010-09-18T11:21:04.180 回答
0

您正在计算状态为 1 或 2 的预订,但我认为您应该计算状态不为 3 或 4 的预订——即消除被拒绝或撤销的预订。

实际上,我现在看到您仅使用预订表中的联接选择了一种预订状态。我怀疑当时的数据。你确定booking_status_id中的id所指的预订状态是最新的吗?

戳了一下这个,我会检查以下内容:

  1. 是否有多个具有相同 ID 的预订状态?
  2. 链接的预订状态是最新的吗?
  3. 你确定你加入的是状态ID,而不是预订ID?

除此之外,我看不到它。

于 2010-09-18T12:23:51.193 回答