Met de onderstaande code wil ik spelers uit de database selecteren die 100 wedstrijd of meer gespeeld hebben.

Daarvoor heb ik twee waardes: een basis plek = Basis, en een inval beurt = Wisselin

Nu wil ik graag iets selecteren in de trend van De Basis + Wisselin< 101

een :
Where SUM( IF( dt.af_DetailType_ID IN ( 1, 3 ) , 1, 0 ) ) < 101
of
LIMIT total

weken dus niet

wat kan/moet ik doen om het wel voor elkaar te krijgen?


SELECT 
 p.Player_Achternaam, 
 p.Player_Voornaam, 
 p.Player_Tussenvoegsel, 
 SUM( IF( dt.af_DetailType_ID = '1', 1, 0 ) ) AS BASIS, 
 SUM( IF( dt.af_DetailType_ID = '3', 1, 0 ) ) AS Wisselin, 
 SUM( IF( dt.af_DetailType_ID IN ( 1, 3 ) , 1, 0 ) ) AS total
FROM 
 af_details dt, 
 af_players p, 
 af_games g
WHERE 
 af_DetailType_ID IN ( 1, 3 )
AND 
  p.Player_ID = dt.af_Player_ID
AND 
  g.Game_ID = af_Game_ID
AND 
 GameType_ID IN ( 1, 2 )
GROUP BY 
dt.af_Player_ID
ORDER BY total DESC 
Implicite joins zijn niet volgens de huidige SQL standaard, leer dit af.

In SQL wordt eerst geselecteerd en gefiltered, dan gegroepeerd (de where staat voor de group by), dus je kan geen aggegrate functies in de where clause gebruiken.

Je hebt hier GROUP BY ... HAVING nodig:


SELECT
p.Player_Achternaam, 
	p.Player_Voornaam, 
	p.Player_Tussenvoegsel, 
 	SUM(dt.af_DetailType_ID = 1) AS BASIS, 
	SUM(dt.af_DetailType_ID = 3) AS Wisselin,
	COUNT(*) AS total
FROM
	af_players p
JOIN
	af_details dt
	ON p.Player_ID = dt.af_Player_ID
JOIN
	af_games g
	ON g.Game_ID = af_Game_ID
WHERE
	af_DetailType_ID IN (1,3)
	AND
	g.GameType_ID IN (1,2)
GROUP BY
	dt.af_Player_ID
	HAVING total >= 100

Dat is hen !!


Thanks Ger

Reageren