スポーツ アカデミーの管理に使用するデータベースがあります。これで、players、class、および class_player (他の 2 つのテーブルを結合する) のテーブルができました。私がやりたいことは、プレーヤーをクラス A に登録するときに、(クラス A 時間と交差する) クラス B に登録されているプレーヤーが select ステートメントの結果セットから削除されることです。
Player Table: class Table class_player Table
ID INT ID INT classID INT
timeFrom TIME playerID INT
timeTo TIME
days BIT(7)
「クラス」テーブル: timeFrom: はクラスの開始時刻
です timeTo: はクラスの終了時刻です
days: クラスが教えられる日を保持します。
例: 0x000001 -> 7 日間のうちの 1 日にこのクラスが含まれます
プレーヤーを取得するために使用する select ステートメント:
(
SELECT `players`.`ID`
FROM `players` JOIN `class_player` ON `players`.`ID` = `class_player`.`playerID`
JOIN `classes` ON `class_player`.`classID` = `classes`.`ID`
WHERE (
-- Get all player with no day intersection
-- 1 is a variable of the entered day ex: 0x00100100
NOT (`classes`.`days` & 1)
-- Time Intersection
OR (
-- Entered "FROM" != Existing "FROM"
'10:00:00' != `timeFrom`
-- Entered "TO" != Existing "TO"
AND '13:00:00' != `timeTo`
-- Entered "FROM" Not Between Existing (FROM, TO)
AND NOT ('10:00:00' > `timeFrom` AND '10:00:00' < `timeTo`)
-- AND '10:00:00' NOT BETWEEN `timeFrom` AND `timeTo`
-- Entered "TO" Not Between Existing (FROM, TO)
AND NOT ('13:00:00' < `timeTo` AND '13:00:00' > `timeFrom`)
-- AND '13:00:00' NOT BETWEEN `timeFrom` AND `timeTo`
-- Entered "FROM" Not Less than Existing "FROM"
-- Entered "TO" Not Bigger than Existing "TO"
AND NOT ('10:00:00' < `timeFrom` AND '13:00:00' > `timeTo` )
)
)
)
UNION
(
-- Players who don't have any classes
SELECT `players`.`ID`
FROM `players`
WHERE `players`.`ID` NOT IN (SELECT `playerID` FROM `class_player`)
);
問題は、プレーヤーが classA 時間と交差するクラスと交差しないクラスの 2 つのクラスを持っている場合、このプレーヤーが結果セットに表示されることです!!