Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: MySQL haku taulujen liitos

Teuro [21.06.2020 15:05:09]

#

Minulla on tekeillä ohjelma, johon lisätään pelaajien testituloksia. Tavoitteena olisi saada ulos kaikki syötetyt tulokset, jonka lisäksi halutaan kaikki rivit pelaajista ja testeistä.

Hakujen kannalta oleelliset taulut ovat:

Rivimäärät tauluissa:

Tavoitteena on siis saada tulosjoukko, jossa on viimeisimmät tulokset testeistä pelaajittain. Tämä on varsin helppoa. Lisäksi tulosjoukkoon halutaan jokainen pelaaja jokaiseen testiin, jolloin sarakkeet 'tulos' ja 'paivamaara' ovat NULL.

Alla on tuloste taulusta tulokset.

id	testi_id	paivamaara		henkilo_id		tulos
1	1 [->]		2020-06-20		1 [->]			4.53
2	1 [->]		2020-06-20		2 [->]			4.28
3	2 [->]		2020-06-20		1 [->]			180.00
4	1 [->]		2020-06-30		1 [->]			4.16
5	1 [->]		2020-06-20		3 [->]			5.22

Haluttu lopputulos olisi muotoa:

etunimi	sukunimi	testi_id	paivamaara	tulos	yksikko
Joku	Jokunen		1			2020-06-18	4.22	s
Ville	Virtanen	1			2020-06-18	3.98	s
.
.
.
Keski	Ketterä		2			2020-06-18	NULL	kpl
.
.
.
Vika	Niminen		3			2020-06-18	190		s

Lopputuloksena pitäisi olla pelaajamäärä (17) * testimäärä (5), joista NULL poikkeava arvo pitäisi olla 5 rivillä. Yhteensä siis 85 riviä tulosjoukossa.

Sain aikaiseksi seuraavan SQL-kyselyn, jolla tulee toki oikeat syötetyt arvot, mutta tuloksena on vain viisi riviä.

SELECT
		henkilot.etunimi,
		henkilot.sukunimi,
		testit.nimi,
		tulokset.tulos,
		yksikot.yksikko
	FROM
		yksikot,
		tulokset
	LEFT JOIN
		testit ON testit.id = tulokset.testi_id
	LEFT JOIN
		henkilot ON tulokset.henkilo_id = henkilot.id
	WHERE
		yksikot.id = testit.yksikko_id

Metabolix [21.06.2020 15:25:41]

#

LEFT JOIN tarkoittaa, että vasemmalta tulevat kaikki rivit ja oikeanpuoleista ei ole pakko löytyä. Oikea liitos on siis juuri päinvastainen: SELECT ... FROM henkilot, testit LEFT JOIN tulokset ... LEFT JOIN yksikot.

Teuro [21.06.2020 17:04:27]

#

Aivan oikein ajatus katkesi jossakin välissä pahasti.

Tulostus ei mene kuitenkaan vielä aivan täsmälleen oikein. Tuloksiin tulee id-numerolla tieto kenen suoritus kyseine rivi on. Nyt pitää siis saada vielä tämä yhteys paikalleen.

Alla olevalla kyselyllä tulee virhe, ettei taulu henkilot ole sopiva.

testisivu kirjoitti:

Column not found: 1054 Unknown column 'henkilot.id' in 'on clause''

SELECT
		henkilot.etunimi,
		henkilot.sukunimi,
		testit.nimi,
		tulokset.tulos,
		yksikot.yksikko
	FROM
		henkilot,
		testit
	LEFT JOIN
		tulokset ON testit.id = tulokset.testi_id AND henkilot.id = tulokset.henkilo_id
	LEFT JOIN
		yksikot ON yksikot.id = testit.yksikko_id

Seuraavalla kysely tietenkin onnistuu, mutta linkitys tuloksien ja henkilöiden väliltä puuttuu. Tuloksiin tulee siis suorituksia myös pelaajille, joilla ei ole vielä merkitty suoritusta kyseiseen testiin.

SELECT
		henkilot.etunimi,
		henkilot.sukunimi,
		testit.nimi,
		tulokset.tulos,
		yksikot.yksikko
	FROM
		henkilot,
		testit
	LEFT JOIN
		tulokset ON testit.id = tulokset.testi_id
	LEFT JOIN
		yksikot ON yksikot.id = testit.yksikko_id

Metabolix [21.06.2020 18:44:58]

#

Niin no tässähän olennainen kysymys on se, millä nimellä id on henkilötaulussa, kun kerran ei löydy. Eli ylempi kysely on aivan oikea, kunhan tarkastat taulustasi, mikä se henkilot.id kuuluisi olla.

Teuro [21.06.2020 19:12:45]

#

henkilot taulussa on sarake nimeltä id, joten se ei ole ongelmana. Nähtävästi testit-taulu tulee liittää JOIN-avainsanalla mukaan. Ainakin nyt tulokset näyttävät tulevan juuri kuten pitääkin.

SELECT
	henkilot.id,
	henkilot.etunimi,
	henkilot.sukunimi,
	testit.nimi,
	tulokset.tulos,
	yksikot.yksikko
FROM
	henkilot
JOIN
	testit
LEFT JOIN
	tulokset ON testit.id = tulokset.testi_id AND tulokset.henkilo_id = henkilot.id
LEFT JOIN
	yksikot ON yksikot.id = testit.yksikko_id

Vastaus

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

Tietoa sivustosta