Uitgebreide query
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:
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 die ik nu heb:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
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
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
Gewijzigd op 01/01/1970 01:00:00 door Mr D
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.
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
Quote:
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.als iemand nog geen voorspelling heeft gedaan zitten er ook geen rijen in de tabel voorspelling
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
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)
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
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)
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
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
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
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
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.




