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構文にエラーがあります。そのマニュアルを確認してください

'SELECT Booking_id AS bk_id、max(booking_status_type_id)ASbの近くで使用する正しい構文のMySQLサーバーのバージョンに対応します

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でない予約をカウントする必要があると思います。つまり、拒否または取り消された予約を削除します。

実際、予約テーブルからの参加を使用して、1つの予約ステータスのみを選択していることがわかりました。その時のデータを疑っています。Booking_status_idのIDで参照されている予約ステータスが最新のものであると確信していますか?

これをいじくり回したので、私は以下をチェックします:

  1. 同じIDの予約ステータスは複数ありますか?
  2. リンクされた予約ステータスは最新のものですか?
  3. 予約IDではなくステータスIDで参加してもよろしいですか?

それ以外は見えません。

于 2010-09-18T12:23:51.193 に答える