Denna delen av 99 uppdateras inte längre utan har arkiverats inför framtiden som ett museum.
Här kan du läsa mer om varför.
Mac-nyheter hittar du på Macradion.com och forumet hittar du via Applebubblan.

SQL: Hjälp med join (outer?)

Tråden skapades och har fått 2 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2005-06-23 01:01

Hej,

Jag håller på och lattjar och gör ett system för att hålla koll på vilka fotbollsspelare som varit med och spelat på en match. Har en tabell över fotbollsspelares status('Y'=spelade, 'N'=spelade inte, '?'=vet ej om spelaren var med) för en särskild match/lag och har en annan tabell över vilka spelare som finns tillgängliga i laget för en viss säsong.

Här är tabellen som håller koll på en spelares status för en viss match

-- 
-- Table structure for table `game_players`
-- 

CREATE TABLE `game_players` (
  `game_id` int(6) NOT NULL default '-1',
  `team_id` int(5) NOT NULL default '1',
  `player_id` int(6) NOT NULL default '-1',
  `played` enum('Y','N','?') NOT NULL default 'N'
  PRIMARY KEY  (`game_id`,`player_id`,`team_id`)
) TYPE=MyISAM;

Här är tabellen som säger vilka spelare som finns tillgängliga i laget för den valda säsongen

-- 
-- Table structure for table `team_players`
-- 

CREATE TABLE `team_players` (
  `season_id` int(3) NOT NULL default '1',
  `player_id` int(5) NOT NULL default '1',
  `team_id` int(5) NOT NULL default '1',
  `comment` text
  PRIMARY KEY  (`player_id`,`season_id`,`team_id`)
) TYPE=MyISAM;

Nu vill jag joina ihop dessa så jag hämtar alla spelare som finns tillgängliga för den valda säsongen och deras status för en viss vald match. De spelare som inte finns med i statustabellen (dvs man har inte specifikt sparat in deras status) ska få statusvärdet '?'.

Ett sätt borde vara att välja allt ifrån game_players för en viss match och lag... sen väljer man alla i team_players som inte finns med i den första selektionen och som "played" värde skriver man i select-satsen ett '?'

Det är bara att jag inte vet hur man skriver riktigt... någon som vet?

Vänligen
Ivar

SELECT a.player_id, IFNULL(b.played, '?')
FROM team_players a LEFT JOIN game_players b ON (a.player_id = b.player_id)
WHERE a.season_id...

dvs utgå från team_players inte game_players.

Joakim

  • Medlem
  • Stockholm
  • 2005-06-23 09:39

Aha, vad bra!

Känner mig urpuckad men jag klarar inte av att utveckla den där så det händer lite mer...
såhär ser mitt försök ut

$sql = "	SELECT
					IFNULL(gp." . GAME_PLAYERS_TABLE_PLAYERSTATUS . ",'?') AS " . GAME_PLAYERS_TABLE_PLAYERSTATUS . ",
					p." . PLAYERS_TABLE_ID . ",
					p." . PLAYERS_TABLE_NAME_FIRST . ",
					p." . PLAYERS_TABLE_NAME_SUR . "
				FROM
					" . PLAYERS_TABLE . " p,
					" . TEAM_PLAYERS_TABLE . " tp LEFT JOIN " . GAME_PLAYERS_TABLE . " gp ON (tp." . TEAM_PLAYERS_TABLE_PLAYER_ID . "=gp." .GAME_PLAYERS_TABLE_PLAYER_ID . ")
				WHERE
							gp." . GAME_PLAYERS_TABLE_GAME_ID . " = $game_id
					AND	gp." . GAME_PLAYERS_TABLE_TEAM_ID . " = $team_id
					AND	tp." . TEAM_PLAYERS_TABLE_PLAYER_ID . " = p." . PLAYERS_TABLE_ID . "
				GROUP BY p." . PLAYERS_TABLE_ID . "
				ORDER BY " . PLAYERS_TABLE_NAME_SUR;
1
Bevaka tråden