En löytänyt vastaavaa esimerkkiä, joten ajattelin kysyä sitten täältä. Oletetaan, että tietokannan taulussa olisi viisi tietuetta. Haluaisin hakea sieltä ensimmäisen rivin, keskimmäisen ja viimeisen.
SELECT * FROM taulu WHERE id IN (1, 3, 5)
Eli tuon kyselyn haluaisin tehdä automaattiseksi niin, että ei tarvitsisi itse käsin määrittää mitkä tietueet haetaan, vaan kysely osaisi hakea taulusta koko väliltä tietyn määrän tietueita, sopivin välein. Niin, mikäli se on mahdollista toetuttaa. Oikeassa tilanteessa tietueita on tuhansia, ja id-numerokaan ei edes ala numerosta 1, vaan sieltä on poistettu iso määrä ensimmäisiä tietueita.
Jos voidaan olettaa, että id:ssä puuttuu numeroita vain alusta mutta ei välistä (ei siis esim 2,3,5,6, mutta 2,3,4,5,6 käy) niin varmaan jotenkin tähän tyyliin:
SELECT * FROM taulu WHERE id IN ( SELECT @eka := min(id) id, (@vika := max(id)) FROM taulu UNION SELECT (@eka+@vika)/2 id UNION SELECT @vika id )
En testannut mitenkään, eli ei ehkä ihan tuollaisenaan toimi. En muista tekeekö mysql tuossa kokonaislukujaon vai liukulukujaon. Jos liukulukujaon niin vaatinee jonkun floor tms. kutsun tuohon keskiarvoon.
Entäs sitten jos haluaisin samalla tavalla hakea 1000 tietueesta 30 tietuetta, samalla periaatteella? Ensimmäinen, viimeinen ja väliin 28 arvoa sopivin etäisyyksin. Tosin, tuota aiempaa en vielä saanut toimimaan..
Sitten kannattaisi tehdä logiikalla että haetaan ensin noi @eka ja @vika muuttujat ja sitten where id sopivafunktio
Tuota sopivafunktiota en nyt ala rakentamaan. Sinänsä se on ihan triviaali, mutta tuntuu kuitenkin jo liikaa työltä. Eli siis logiikka kuitenkin olisi, että ensimmäisellä alikyselyllä haettaisiin taulun pienin ja suurin arvo ja sitten niitä käytettäisiin oikeiden id:iden poimimisessa. Saattaa olla että nuo @eka ja @vika muuttujat saisi tehtyä alikyselynäkin, mutta tässä tapauksessa lienee selkeämpi tehdä erikseen jos mitään estettä ei ole.
Kiitoksia neuvoista. Yritän näillä eväillä päästä eteenpäin. :)
Käytä kongruenssia. Jotain tyyliin
SELECT * FROM taulu WHERE MOD(id,n) = 0 UNION # joka n:s SELECT * FROM taulu WHERE id = a UNION # eka, jos alusta poistettu a-1 riviä SELECT * FROM taulu WHERE id = COUNT(SELECT * FROM taulu)-a+1 # vika
Tuommoinen joka n:s rivi saadaan myös käskyllä
WHERE (rivinro-1)=(FLOOR((rivinro-1)/n))*n
Aihe on jo aika vanha, joten et voi enää vastata siihen.