Reputation: 239
Sorry if my title isn't clear. I’m trying to make a lobby system for my card game. When a user presses join game I want the server to check how much space is available in the game they’ve selected then add them to the team with the least players (currently always 1 player on each team but I’d like to expand it to 2 players per team at some point and possibly more than 2 teams).
The tables I have are:
game_teams
game_id, team_id, score
game_players
user_id, game_id, team_id
With game_teams team_id isn't unique or auto-incremented because it seemed like more overhead to have a unique value for every team in every game when they're mostly just there for player placement. So all games have teams 1-2 or 1-3 depending on team count if that makes sense.
The output I’m hoping for is something like:
game_id | team_id | team_size
8 | 1 | 1
8 | 2 | 0
Currently the queries I have are as below but they don’t do what I’m expecting.
This returns all players in team 1 and all players in team 2 ignoring the game id
SELECT games.game_id, COUNT(game_players.user_id) AS team_size, game_teams2.team_id
FROM games
JOIN game_teams2 ON games.game_id=game_teams2.game_id
JOIN game_players ON game_players.team_id=game_teams2.team_id
WHERE games.game_id=1 GROUP BY game_teams2.team_id
This seems to be nearly right but it only returns teams that already have at least 1 player in them where I really need 0 to be returned if the team has no players associated with it.
SELECT game_players.game_id,
COUNT(game_players.user_id) AS team_size, game_players.team_id
FROM game_players WHERE game_players.game_id=8 GROUP BY game_players.team_id
I'm not quite sure what else to try to get the desired output.
Any help would be appreciated.
Upvotes: 0
Views: 41
Reputation: 5837
First, you need to create the distinct set of game_id
and team_id
from game_teams
and then left join it with game_players
.
Something like
SELECT x.game_id,
x.team_id,
count(gp.user_id) AS team_size
FROM
(SELECT DISTINCT game_id,
team_id
FROM game_teams
WHERE game_id = 8) x
LEFT JOIN game_players gp ON x.game_id = gp.game_id
AND x.team_id = gp.team_id
You need to take care of nulls for the gp.user_id
. I have not tested this, this is just an idea.
Upvotes: 1