2013-04-03 69 views
-1

我想從遊戲桌獲取數據以及是否所有玩家都註冊了可用匹配(是/否) 可用匹配是日期是當前日期還是未來日期MySql LeftTo三個表

玩家

(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的交叉連接解決方​​案之外,還有其他方法可以實現嗎?

+0

你想得到什麼?尚未註冊特定匹配的用戶?你能提供你想要的結果的樣本記錄嗎? –

+0

如果所有玩家都註冊了所有可用的比賽(如今天或將來),我需要得到一個是或否, – Marc

+1

[*接受答案如何工作?(clickhere)](http:// meta。 stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – SkyDrive

回答

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上的兩列上加入:GamerIDMatchID

如果表的笛卡爾乘積的結果在表GameMatches上沒有匹配,則列的值爲NULL。因此,它測試COUNT(*)哪些記錄總數等於COUNT(c.GamerID),這只是已註冊的遊戲玩家總數。

+0

您可以提供我們可以測試的樣本記錄嗎? –

+0

它爲什麼會返回空? 'COUNT()'肯定會返回至少一條記錄。 –

+0

和你期望得到什麼? –

0

您只選擇未來有匹配的遊戲。如果你希望未來的比賽的數量,你需要有條件聚集:

SELECT G.*, sum(case when g.gameDate >= date(now()) then 1 else 0 end) as FutureMatches 
FROM game_matches GM 
LEFT JOIN MATCHES M 
ON M.`matchId` = GM.`matchId` 
LEFT JOIN Gamers G ON G.`userId` = GM.`userId` 
GROUP BY G.`userId` 

在實踐中,你可以使用inner join而非left join,因爲相對應的ID表之間的匹配(除非你有興趣的網友認爲根本沒有比賽)。

+0

這裏的內部連接會忽略已註冊零遊戲的遊戲玩家 –

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 
+0

MySql不支持WITH – Marc