Versio

Uitgebreide query

Overzicht Reageren

Mr D

Mr D

09/04/2007 13:49:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
 
PHP hulp

PHP hulp

25/05/2012 16:47:13
Gesponsorde koppelingen:
 
Frank -

Frank -

09/04/2007 13:55:00
Quote Anchor link
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.
 
Mr D

Mr D

09/04/2007 14:18:00
Quote Anchor link
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
 
Frank -

Frank -

09/04/2007 14:24:00
Quote Anchor link
Quote:
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.
 
Mr D

Mr D

09/04/2007 14:28:00
Quote Anchor link
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
 
Mr D

Mr D

10/04/2007 17:40:00
Quote Anchor link
de query om per user te voorspellen hoeveel wedstrijden die heeft voorspeld in een periode lukt nog niet helemaal
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)

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)
 
Frank -

Frank -

10/04/2007 17:46:00
Quote Anchor link
De GROUP BY hoort nĂ¡ de WHERE te komen.
 
Mr D

Mr D

10/04/2007 19:37:00
Quote Anchor link
heb nu de volgende query
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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
 
Frank -

Frank -

10/04/2007 19:41:00
Quote Anchor link
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.
 



Overzicht Reageren