-1

ゲームテーブルからデータを取得しようとしており、すべてのゲーマーが利用可能な試合にサインアップしているかどうか (はい/いいえ) 利用可能な試合は、日付が現在または将来のものです

ゲーマー

(PK)Gamer_Id
Gamer_firstName,
Gamer_lastName,
Gamer experience(Y/N) 

Game_matches

(PK)FK GamerId,
(PK)FK MatchId,
 Gamer_score

マッチ

(PK)Match_Id,
gameDate,
ExperiencedGamers_needed,
InExperiencedGamers_needed

これは私が試したものです。不完全であることはわかっています。CASE も使用する必要がありますか?

SELECT G.*, COUNT(M.`matchId`)
FROM game_matches GM
LEFT JOIN MATCHES M
ON M.`matchId` = GM.`matchId`
LEFT JOIN Gamers G ON G.`userId` = GM.`userId`
WHERE G.`gameDate` >= DATE(NOW())
GROUP BY G.`userId`

JW のクロス結合ソリューションを使用する以外に、これを実現する方法はありますか?

4

3 に答える 3

3
SELECT  a.GamerID,
        a.Name,
        COUNT(*) = COUNT(c.GamerID)
FROM    Gamers a
        CROSS JOIN `Match` b
        LEFT JOIN GameMatches c
            ON  a.GamerID = c.GamerID AND
                b.MatchID = c.MatchID
WHERE   b.gameDate >= CURDATE()
GROUP   BY  a.GamerID,
            a.Name

クエリが行うことは、最初にすべてのゲーマーと今日から始まるすべての試合のデカルト積を取得することです。その後、結果はテーブルGameMatchesの 2 つの列に結合されます:GamerIDMatchID.

テーブルのデカルト積の結果が tableGameMatchesに一致しない場合、列の値はNULLです。したがって、レコードの合計数がサインアップしたゲーマーの合計数とCOUNT(*)等しいかどうかをテストします。COUNT(c.GamerID)

于 2013-04-03T03:00:47.977 に答える
0
WITH MATCHES AS
(
SELECT COUNT(*) AS TOTAL_MATCHES FROM MATCH WHERE gameDate >= CURR_DATE
)

GM AS
(SELECT G.GAMER_ID, COUNT(*) AS GAMER_MATCHES
GAMERS G, GAME_MATCHES GM
WHERE G.GAMER_ID = GM.GAMER_ID
GROUP BY G.GAMER_ID
)

SELECT GM.GAMER_ID
FROM GM, MATCH
WHERE GAMER_MATCHES = TOTAL_MATCHES
于 2013-04-03T04:48:47.640 に答える