Tarkotuksena on laskea raportoinnit tapahtumittain. Käytössä on seuraavat taulut:
tours taulu sisältää tapahtuman perustiedot alkamis- ja loppumispäivän, sekä tapahtuman nimen ja numeraalisen id-numeron. legs taulussa säilötään reitit, jotka kyseiseen tapahtumaan liittyvät siis id-numero lähtö- ja tulopaikka, järjestysnumero, sekä viitetieto tapahtuman id-numeroon. viimeisessä taulussa on id-numero, viittaus suoritetun reitin id-numeroon, suorittajan id-numero, sekä suorituspäivä.
Nyt olisi tarkoitus hakea toureittain kaikkien suoritusten määrä, mutta nyt alkaa tie nousta pystyyn. Tällä hetkellä olen saanut seuraavan kyselyn aikaan
SELECT tours.id, name, start, end, COUNT(*) AS legs FROM reported_legs, tours LEFT JOIN legs ON legs.tour_id = tours.id WHERE start < NOW() AND end > NOW() AND reported_legs.leg_id = legs.id GROUP BY tours.id
Tämä laskee määrät oikein, jos reported_legs taulussa on ainakin yksi raportoitu legi per julkaistu tour. Käsittääkseni on kuitenkin mahdollista laskea myös rivit joille ei ole vastinetta ja tähän sopinee tuo LEFT JOIN, mutta nyt ei ymmärrä miten tuota pitäisi muuttaa.
LEFT JOIN -liitoksella pitää liittää ne taulut, joista rivejä ei välttämättä löydy. Minusta näyttää siis, että legs-taulu pitäisi liittää tavallisella JOIN-liitoksella ja vain reported_legs-taulu LEFT JOIN -liitoksella. Laita kunkin liitoksen ON-kohtaan kaikki kyseistä taulua koskevat ehdot.
SELECT tours.*, COUNT(DISTINCT suorittaja_id) AS suorittajia, COUNT(reported_legs.id) AS suorituksia FROM tours JOIN legs ON legs.tour_id = tours.id LEFT JOIN reported_legs ON reported_legs.leg_id = legs.id WHERE NOW() BETWEEN start AND end GROUP BY tours.id
Hiukan muokattuna toimii aivan oikein. Nyt kyselyn rakenne näyttää olevan aivan oikein ja on samalla helppotajuinen kiitokset.
Aihe on jo aika vanha, joten et voi enää vastata siihen.