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.
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
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.
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...
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.
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...
Aihe on jo aika vanha, joten et voi enää vastata siihen.