Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Hitain aika

Opiskelija [08.06.2005 15:02:32]

#

Millasella kyselyllä saisin hitaimman ajan joka joukkueelta sekä sen tehneen urheilija_ideen?

SELECT [urheilija_id,] MAX(aika) FROM tulokset GROUP BY joukkue_id

Antaa oikean ajan, [] oleva ei palauta tuossa oikeaa tulosta.

Tämmönen ratkaisu tuli myös mieleen, mutta vaikuttaa ehkä liian monimutkaselta yksinkertaiseen hommaan.

SELECT joukkue_id, MAX(aika) FROM tulokset GROUP BY joukkue_id

Tämän jälkeen haetaan silmukassa

SELECT urheilija_id FROM tulokset WHERE aika = (ed.kys aika) and joukkue_id = (ed.kys joukkue_id)

Alikyselyt toimii nykyisellä palvelimella, mutta joskus tulevaisuudessa kenties siirretään muualle, joten alikyselitön ratkaisu olisi ehkä parempa.

ajv [08.06.2005 16:12:59]

#

Ensimmäiseksi tulee mieleen, että miksi joukkue_id:n täytyy olla tulokset-taulussa? Äkkiseltään voisin kuvitella tuon tiedon löytyvän myös urheilija-taulusta, eikö? Tällöin kyselysi menisi päästäheitettynä seuraavasti:

SELECT
   MAX(t.aika),
   u.id AS uid, /*urheilijan id urheilijat-taulusta*/
   j.id AS jid  /*joukkueen id joukuueet.taulusta*/
FROM
   tulokset AS t
LEFT JOIN
   urheilijat AS U ON t.urheilija_id = u.id
LEFT JOIN
   joukkueet AS j ON u.joukkue_id = j.id
GROUP BY
   jid

Opiskelija [08.06.2005 17:55:57]

#

Löytyyhän toi joukkue_id:n tieto myös urheilijat taulustakin, empä ajatellut, et turhaan sitä toiseen tauluun laittaa, nyt asia korjattu kiitoksia.

Mutta itse ongelma vielä on, kyselysi ei toimi halutulla tavalla palauttaa väärää tietoa, kuten toi mun ensinmäinen esimerkkikin.

Kysely tuottaa tulokseksi

Aika	|	uid	|	jid
545	|	2	|	2



Tulokset taulu näyttää tältä
Aika	|  urheilija_id
540	|	2
545	|	5

Joten uid pitäisi olla 5 eikä 2. Saman joukkueen jäseniä kyllä ovat. Eikös MAX(t.aika) palauta vain ryhmän suurimman ajan, muihin valittuisiin sarakkeisiin tulee sitten mitä sattuu, ellei järjestä jonkin mukaan.

ajv [08.06.2005 23:02:39]

#

Opiskelija kirjoitti:

Eikös MAX(t.aika) palauta vain ryhmän suurimman ajan, muihin valittuisiin sarakkeisiin tulee sitten mitä sattuu, ellei järjestä jonkin mukaan.

Juuh, näinhän se tekee. Tuo ei kyllä taida ratketa yhdellä kyselyllä. Hitto kun noita alikyselyitä ja muita uusia MySQL:n uusia ominaisuuksia ei vielä kauheasti uskalla käyttää. En paremmin tiedä, mutta voisin veikata, että esim prosedyyrien tai näkymä-taulujen käyttö webbisovelluksissa on hieman kyseenalaista ainakin isommilla datamäärillä niiden monimutkaisen rakenteen vuoksi. Noh, ehkä täytyisi vaan rohkeasti tutustua niihin paremmin...

Opiskelija [10.06.2005 00:47:42]

#

Löytyi ratkaisu ongelmiin http://dev.mysql.com/doc/mysql/en/example-maximum-column-group-row.html


Tulipas huvikseen haettua toi myslin 5 beta ja leikittyä sen uusilla ominaisuuksilla, kyllä noi näkymät on todella näpsäköitä. Saisivatpa pian sen 5 version valmiiksi, tosin yleistymistä sit saakin odotella pitkään.


Teimpäs huvikseni pienen nopeus testin tässä ongelmassa. Rivejä parisenkymmentä tuhatta.

Näkymällä 0,06 sek
MAX-CONCAT 0,08 sek
Alikyselyllä 0,45 sek (tiedä sit mistä johtuu hitaus)

Tosin monimutkasessa kyselyssä näkymän sijaan oli nopeempa tehdä kaksi kyselyä, mutta ero pienenpieni (0,07 sek), joten tekeekö helpommalla tai vaikeammalla tavalla siinä pulma.

ajv [10.06.2005 10:53:18]

#

Vai että noinkin nopeita nuo näkymät... Täytyy alkaa perehtymään enemmän. Näkymät ovat käsittääkseni mukana jo Uusimassa 4-versiossakin, että ehkä ne pikkuhiljaa yleistyvät...

Vastaus

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

Tietoa sivustosta