query: score per user berekenen
Nu is er ook nog de mogelijkheid tot het inzetten van een joker. In dit geval moeten er voor die wedstrijd geen 3 maar 6 punten worden toegekend. De tabel joker ziet er zo uit
user_id | wedstrijd_id
query die ik nu heb:
SELECT
COUNT(*) * 3 + COUNT(joker.wedstrijd_id) * 3
AS score,
voorspelling.user_id
FROM voorspelling
INNER JOIN wedstrijd ON
(voorspelling.thuis_score = wedstrijd.thuis_score AND voorspelling.uit_score = wedstrijd.uit_score)
LEFT JOIN joker ON
(wedstrijd.id = joker.wedstrijd_id)
WHERE
wedstrijd.id IN(".implode(',', $wedstrijden).")
GROUP BY voorspelling.user_id
probleem bij deze query is dat bij elke user alle jokers worden meegeteld. Hoe verwerk ik nu de joker.userid nog in de query?
Het deel tussen () vorm een nieuwe tabel waarop je de JOIN kan uitvoeren. Ga eens naar de JOIN tutorial die je links wel zal zien staan, daarin wordt een JOIN met meerdere tabellen uitgelegd. Die moet jij gebruiken om tot het juiste resultaat te komen.
deze query werkt dus op zich wel, alleen hij pakt dus bij elke user als jokers in de tabel joker terwijl die alleen moet kijken naar de jokers per user
De opbouw van een JOIN met meerdere tabellen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT gegevens
FROM hoofdtabel -> users denk ik voor jou
INNER JOIN(
subtabel1 -> denk voorspelling
INNER JOIN(
subtabel2 -> denk wedstijd
INNER JOIN
subtabel3 -> zou dan joker zijn
ON .....)
ON ....)
ON....
FROM hoofdtabel -> users denk ik voor jou
INNER JOIN(
subtabel1 -> denk voorspelling
INNER JOIN(
subtabel2 -> denk wedstijd
INNER JOIN
subtabel3 -> zou dan joker zijn
ON .....)
ON ....)
ON....
Dit stukje maakt als het ware een nieuwe tabel, waarin de joker en de wedstrijd tabel al zijn gekoppeld.
Volgend stukje maakt van die hiervoor genoemde "nieuwe tabel" van joker en wedstrijden en de voorspellingstabel weer een nieuwe tabel als het ware.
Zo gaat dat steeds verder. (hopelijk is dit duidelijk, maar wat ik bedoel is dat je die tut maar eens moet lezen, omdat je nu de JOIN op een verkeerde manier gebruikt.
snap het principe wel, maar de toepassing lukt nog niet helemaal. In jouw voorbeeld zie ik ook overal een INNER JOIN. een joker is bestaat maar bij bepaalde wedstrijden, dus moet dat niet een LEFT JOIN worden
Maar kijk maar eens naar de syntax van mijn query, je ziet overal een INNER JOIN, maar het is een heel andere query dan die van jou. Je moet hem als het ware van binnen naar buiten lezen. De binnenste JOIN (let hierbij op: dat is het stukje dat tussen de binnenste 2 () staat) wordt gebruikt voor die daarom heen. Je koppeld nu alle tabellen. Jij zet gewoon 2 keer een JOIN erin zonder dat daar logica in zit. Je zal een beetje moeten spelen met de volgorde van de tabellen in de query zoals ik hem voor deed in de vorige post.
oplossing:
SELECT
COUNT(*) * 3 + COUNT(joker.wedstrijd_id) * 3
AS score,
voorspelling.user_id
FROM voorspelling
INNER JOIN wedstrijd ON
(voorspelling.thuis_score = wedstrijd.thuis_score AND voorspelling.uit_score = wedstrijd.uit_score)
LEFT JOIN joker ON
(wedstrijd.id = joker.wedstrijd_id AND voorspelling.user_id = joker.user_id)
WHERE
wedstrijd.id IN(".implode(',', $wedstrijden).")
GROUP BY voorspelling.user_id