Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: MySQL kyselyyn apua

NuMiNi [10.08.2012 10:57:07]

#

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.

Grez [10.08.2012 11:06:24]

#

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.

NuMiNi [10.08.2012 12:21:10]

#

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..

Grez [10.08.2012 13:16:47]

#

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.

NuMiNi [10.08.2012 13:24:56]

#

Kiitoksia neuvoista. Yritän näillä eväillä päästä eteenpäin. :)

Jaska [10.08.2012 14:31:33]

#

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

Vastaus

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

Tietoa sivustosta