Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: SQL: Raportointi tapahtumittain

Teuro [05.02.2013 08:15:03]

#

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.

Metabolix [05.02.2013 12:51:35]

#

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

Teuro [05.02.2013 13:44:11]

#

Hiukan muokattuna toimii aivan oikein. Nyt kyselyn rakenne näyttää olevan aivan oikein ja on samalla helppotajuinen kiitokset.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta