1

スポーツ アカデミーの管理に使用するデータベースがあります。これで、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 つのクラスを持っている場合、このプレーヤーが結果セットに表示されることです!!

4

1 に答える 1

0

最初に:彼の努力に対するwojciechzのおかげで、解決策は彼の2番目の答えにありましたが、私の友人が私に同様の解決策を教えてくれるまで私はそれを理解しませんでした。

2番目:SQLの解決策は次のとおり
です。1。忙しいすべてのプレーヤーを取得します
。2。次に、このリストにないプレーヤーを検索します。

SELECT DISTINCT `ID` FROM `players` WHERE `ID` NOT IN (
    (
        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
            (`classes`.`days` & 1)

            -- Time Intersection
            AND (
                    -- Entered "FROM" != Existed "FROM"
                    '10:00:00' = `timeFrom` 

                    -- Entered "TO" != Existed "TO"
                    OR '13:00:00' = `timeTo`

                    -- Entered "FROM" Not Between Existing (FROM, TO)
                    OR ('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)
                    OR ('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"
                    OR ('10:00:00' < `timeFrom` AND  '13:00:00' > `timeTo` )

            )
        )
    )
    UNION
    (
        -- ANOTHER DATE AND TIME
    )
)
于 2012-10-05T12:05:15.400 に答える