クエリを機能させるのに苦労しています。基本的には、埋められていない空席のみを返却する必要があります。たとえば、空席には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構文にエラーがあります。そのマニュアルを確認してください
'SELECT Booking_id AS bk_id、max(booking_status_type_id)ASbの近くで使用する正しい構文のMySQLサーバーのバージョンに対応します
MySQLのバージョンは4.0です