MySQL dubbel LEFT JOIN och COUNT som ska ge 0

Tråden skapades och har fått 8 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2005-05-14 22:22

Har behov av dubbel LEFT JOIN men kommer inte på hur

Såhär ser min PHP-kod ut

$sql	="
	SELECT	s.id, s.ute_inne, s.period, s.division, games.num_games, teams.num_teams
	FROM seasons s,
		( SELECT season_id, COUNT(*) AS num_games FROM games GROUP BY season_id) AS games,
		( SELECT season_id, COUNT(*) AS num_teams FROM season_teams GROUP BY season_id) AS teams
	WHERE		games.season_id = s.id
		AND	teams.season_id = s.id
	ORDER BY s.period DESC";

Kom på att man kunde nästla i FROM-satsen så jag har lyckats med dubbla LEFT JOIN. Däremot så vill jag även att det ska returnera 0 och inte NULL när det inte matchas mot någon rad i den högra tabellen.

$sql	=	"	SELECT	s.id, s.ute_inne, s.period, s.division, games.num_games, teams.num_teams
				FROM (
							seasons s
							LEFT JOIN
							((	SELECT season_id, COUNT(*) AS num_games
								FROM games
								GROUP BY season_id) AS games
							)
							ON s.id=games.season_id
						)
						LEFT JOIN 
						(
							((	SELECT season_id, COUNT(*) AS num_teams
								FROM season_teams
								GROUP BY season_id) AS teams
							)
						)
						ON s.id=teams.season_id
				ORDER BY s.period DESC";

Någon som vet hur man får 0 som resultat för num_games och num_teams när de inte finns några rader alls? Just nu returneras alltså NULL

  • Medlem
  • Sollefteå
  • 2005-05-14 23:05

IFNULL(x,17) returnerar x om x inte är null och 17 om det är det.

SELECT
s.id,
s.ute_inne,
s.period,
s.division,
IFNULL(games.num_games, 0) ,
IFNULL(teams.num_teams, 0)

borde byta ut alla NULL's mot nollor i resultsettet.

(I MSSQL heter motsvarande sak ISNULL() istället)

  • Medlem
  • Stockholm
  • 2005-05-14 23:59

Bra! Precis vad jag söker

men...

När jag skriver

SELECT	s.id, s.ute_inne, s.period, s.division, IFNULL(games.num_games, 0) , IFNULL(teams.num_teams, 0)

Så selectar den inte längre num_games och num_teams utan textsträngen "IFNULL(games.num_games, 0)" och "IFNULL(teams.num_teams, 0)"

Varför nu detta? Varför körs inte funktionen istället?

  • Medlem
  • Stockholm
  • 2005-05-15 14:33

Ingen som vet varför IFNULL blir en textsträng som returneras istället för att köras som en funktion?

Version?

Your MySQL connection id is 989 to server version: 4.1.10-standard
  • Medlem
  • Stockholm
  • 2005-05-15 23:46

Nu kom jag på vad det var.

Kan inte skriva IFNULL(games.num_games, 0) och sen försöka komma åt num_games .... behöver skriva
IFNULL(games.num_games, 0) AS num_games .... då fungerade det utmärkt!

Tack för hjälpen matseng!

  • Medlem
  • Stockholm
  • 2005-06-02 15:45

Efter att ha installerat till tiger så fungerar plötsligt inte det här
Kör samma MySQL såvitt jag vet (4.0.24-max)

$sql_num_games = "(
	SELECT season_id AS id, COUNT(*) AS num_games
	FROM games
	GROUP BY season_id
) ";

$sql	=	"
	SELECT
		s.id,
		s.ute_inne,
		s.period,
		s.division,
		IFNULL(games.num_games, 0) AS num_games
	FROM seasons s LEFT JOIN ($sql_num_games AS games) ON s.id=games.id
		";

Åvanstående ger felet

Notice:  Query failed: You have an error in your
 SQL syntax.  Check the manual that corresponds to your
 MySQL server version for the right syntax to use near '
	SELECT season_id AS id, COUNT(*) AS num_games
	FROM games SQL: 	SELECT
		s.id,
		s.ute_inne,
		s.period,
		s.division,
		IFNULL(games.num_games, 0) AS num_games
	FROM seasons s LEFT JOIN ((	
			SELECT season_id AS id, COUNT(*) AS num_games
			FROM games
			GROUP BY season_id
		)  AS games) ON s.id=games.id

 in /Volumes/Users/ivar/Sites/le/lib/Database/MySQL.php on line 129
Senast redigerat 2005-06-02 16:06
  • Medlem
  • Höganäs
  • 2005-06-03 11:58

Är det inte så att MySQL före 4.1 inte stöder nästlade sökningar?

När det fungerade körde du: 4.1.10
När det inget fungear kör du: 4.0.24

Jag tror Micke F är något på spåren.

  • Medlem
  • Stockholm
  • 2005-06-03 14:52

OJ jäklar!

Trodde jag hade samma version... undrar var jag fick tag på 4.1
Tack för hjälpen, blir till att leta efter 4.1-installern

1
Bevaka tråden