Hei,
Etsin SQL lausetta seuraavalle:
Laskettava KilpuriNroiden määrä, jotka ovat kilpailleet max 2 kertaa ja viimeinen kilpailu on läpäisty?
SELECT KilpuriNro, COUNT(ID), Tulos FROM Tulokset GROUP BY KilpuriNro....
Ääh, jotain tuohon?
Tuo max 2 kertaa kilpaileminen on triviaali
SELECT KilpuriNro, COUNT(ID) FROM Tulokset GROUP BY KilpuriNro HAVING COUNT(ID)<3
Tuo toinen, että viimeinen kilpailu on läpäisty on hieman hankalampi. Kysymyksenasettelusta ei edes tiedä mistä tietää onko kilpailu läpäisty vai ei. Tulos sarakkeessa lienee on jotain, mutta mitä.
Suoran vastauksen antamiseen auttaisi myös jos tietäisi mikä kanta kyseessä.
Yksi ratkaisu on tällainen:
SELECT t1.KilpuriNro, t2.Tulos AS VanhaTulos FROM Tulokset AS t1 LEFT JOIN Tulokset AS t2 ON t2.KilpuriNro = t1.KilpuriNro AND t2.ID < t1.ID LEFT JOIN Tulokset AS t3 ON t3.KilpuriNro = t1.KilpuriNro AND t3.ID NOT IN (t1.ID, t2.ID) WHERE t1.Tulos = "läpi" AND t3.ID IS NULL
Miksi tämä kysely toimii? WHERE-kohdan mukaan t1 sisältää varmasti läpäistyn kilpailun ja t3 ei sisällä mitään, ja ensimmäisen liitoksen mukaan t2 sisältää kilpailun, joka on ennen t1:tä. Jos tuloksia on enemmän kuin kaksi, t3 sisältää myös jonkin tuloksen ja ehto ei toteudu. Samoin jos t1 ei ole uusin tulos, t3 sisältää uusimman tuloksen ja ehto ei toteudu.
Kyselyssä oletetaan, että ID on oikea tapa vertailla järjestystä. Jos taulussa on erikseen aikaleima, ensimmäisessä liitoksessa kuuluu käyttää sitä.
Kiitos kommenteista! Vähän tarkennusta, kun kieltämättä vähän epäselvästi olin laittanut. Tuloskertoja voi olla yli kolmekin, vaikka 6. Tulosrivillä tarviisin tuon count(id).. Suurin id on uusin tulos. Tulos on kannassa läpi tai eiläpi. Koodilla .net tai php ottaisin sql:stä tuloksen, eli jos juoksukertoja oli max 2 ja tulos tällä tokalla kiekalla oli nimenomaan läpi.
Luitkohan viestiäni, tai kokeilitko koodiani?
Et ilmeisesti ole ajatellut asiaa loppuun asti. Uusimman juoksun tulos on turha hakea, koska jo ehto määrää, että se on läpi. COUNT(ID) on turha hakea, koska se on aina 1 tai 2 ja sen voi päätellä siitä, onko edellisen juoksun tulos NULL (ei tulosta, vain 1 juoksu) vai jokin muu (on tulos, 2 juoksua).
Jos olet sitä mieltä, että kyselyni ei tuota tyydyttävää tulosta, et ole vieläkään onnistunut selittämään tilannettasi tarpeeksi hyvin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.