ik heb een systeem waarbij gebruikers voorspellingen kunnen doen van wedstrijden. Nu moet ik de gebruikers selecteren die nog niet alle wedstrijden binnen een bepaald aantal dagen voorspeld hebben.

De query die ik nu heb:

SELECT user.email 
FROM user 
   RIGHT JOIN  
	(wedstrijd
		LEFT JOIN voorspelling
		ON voorspelling.wedstrijd_id = wedstrijd.id
	)
   ON voorspelling.user_id = user.id 
WHERE 
   wedstrijd.datum BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL ".(int) $_POST['dagen']." DAY) AND
   voorspelling.thuis_score IS NULL AND
   voorspelling.uit_score IS NULL


deze query geeft echter maar 1 rij terug met een lege waarde

de tabellen die ik heb, iets versimpeld

user.id
user.email

wedstrijd.id
wedstrijd.datum
wedstrijd.thuis_score
wedstrijd.uit_score

voorspelling.id
voorspelling.user_id
voorspelling.wedstrijd_id
voorspelling.thuis_score
voorspelling.uit_score
De query zit raar inelkaar. Waarom zou je in de tabel 'voorspelling' al een id, user_id en wedstrijd_id hebben wanneer iemand nog helemaal geen voorspelling heeft gedaan? Hiermee help je een deel van de kracht van de database al weer om zeep, verplichte velden thuis_score en uit_score zijn niet mogelijk.

Aanpak:
- Tel hoeveel wedstrijden er in een bepaalde periode zijn
- Tel hoeveel wedstrijden er per user zijn voorspeld.
- Wanneer dat niet gelijk is aan elkaar, dan heeft een user te veel of te weinig voorspellingen gedaan.
als iemand nog geen voorspelling heeft gedaan zitten er ook geen rijen in de tabel voorspelling, dat maakt de query ook wat lastiger. Maar ik zal jouw aanpak eens proberen
als iemand nog geen voorspelling heeft gedaan zitten er ook geen rijen in de tabel voorspelling
Waarom vergelijk je dan op IS NULL wanneer een record niet eens bestaat? Dat gaat niet lukken, iets wat niet bestaat is zelfs niet gelijk aan NULL.
De bedoeling van de JOIN was dat hij bij elke wedstrijd de voorspellingen zou zoeken, door de JOIN zal hij er een NULL waarde bij zetten als er geen voorspelling gevonden wordt
de query om per user te voorspellen hoeveel wedstrijden die heeft voorspeld in een periode lukt nog niet helemaal

SELECT COUNT(*) AS aantal_voorspellingen, user.email
						FROM voorspelling
						INNER JOIN wedstrijd ON
							wedstrijd.id = voorspelling.wedstrijd_id
						INNER JOIN user ON
							user.id = voorspelling.user_id
						GROUP BY voorspelling.user_id
						WHERE wedstrijd.datum BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL ".(int) $_POST['dagen']." DAY)

deze query geeft een foutmelding bij de WHERE:

MySQL Error: 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 'WHERE wedstrijd.datum BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 14 DAY)
De GROUP BY hoort nĂ¡ de WHERE te komen.
heb nu de volgende query

SELECT COUNT(*) AS aantal_voorspellingen, user.email
	FROM user
		LEFT JOIN voorspelling ON
			user.id = voorspelling.user_id
		INNER JOIN wedstrijd ON
			wedstrijd.id = voorspelling.wedstrijd_id
WHERE wedstrijd.datum BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL ".(int) $_POST['dagen']." DAY)
GROUP BY user.id

het probleem is dat hij alleen het aantal voorspellingen weergeeft voor users met minstens 1 voorspelling. Hij geeft dus niet de users weer die nog geen voorspelling hebben
Je hebt een subquery nodig. Je zult namelijk eerst vast moeten stellen hoeveel wedstrijden (x) er moeten worden voorspeld. Vervolgens ga je de users opzoeken die minder dan x voorspellingen hebben gedaan. Je hebt dus 2x een COUNT nodig.

Reageren