Kuinka hakea "ei merkattua" dataa tietokannasta parhaiten?

Liittynyt
17.10.2016
Viestejä
481
Minulla on tekeillä simppeli sovellus, jossa käyttäjältä kysytään satunnainen kysymys, joka haetaan tietokannasta. Mikä olisi paras tapa tai mikä on yleinen tapa, jossa samaa kysymystä ei esitetä kahta kertaa samalle käyttäjälle? Haluaisin kysymysten olevan randomeita joten alusta asti ID kerrallaan ei olisi kiva ratkaisu koska kaikki käyttäjät saisi saman kysymysjärjestyksen.
 
Liittynyt
13.03.2018
Viestejä
12
Hei,

Yksi vaihtoehto voisi olla, että sinulla on yhdessä taulussa kysymykset ja attribuutit esim. Kysymys_ID, Kysymys Vastaus.
Toinen taulu on kysytyistä kysymyksistä, jonka attribuutit olisi, Kysymys_ID, Käyttäjä_ID ja käyttäjän vastaus / vastasiko oikein / väärin.

Kun esität kysymystä käyttäjälle, tarkistat ensin toisesta taulusta, onko tämä arvottu kysymys_id jo kysytty tältä käyttäjältä.
 
Liittynyt
17.10.2016
Viestejä
14 697
Ja jos riittää, että saman session aikana ei tule samaa kyssäriä kahdesti, niin tallennat jo näytetyt kysymykset vain sessioon käyttäjälle. Tohon random sampleen on kaikenlaisia tapoja. Joko pidät kirjaa arvotuista ja arvot uuden kun tarvitsee (ei tehokas kun se arvottujen määrä on lähellä koko määrää). Riippuen kielestä, tuota ei edes tarvitse tehdä itse:


Tai sitten teet itse:


Riippuu tosiaan tilanteesta, kuinka hienosti tämä kannattaa ratkoa.
 
Liittynyt
17.10.2016
Viestejä
481
Hei,

Yksi vaihtoehto voisi olla, että sinulla on yhdessä taulussa kysymykset ja attribuutit esim. Kysymys_ID, Kysymys Vastaus.
Toinen taulu on kysytyistä kysymyksistä, jonka attribuutit olisi, Kysymys_ID, Käyttäjä_ID ja käyttäjän vastaus / vastasiko oikein / väärin.

Kun esität kysymystä käyttäjälle, tarkistat ensin toisesta taulusta, onko tämä arvottu kysymys_id jo kysytty tältä käyttäjältä.
Mietin tätä kanssa, mutta ongelmia muodostuu jos käyttäjä on vastannut esim 90% kysymyksistä ja kysymyksiä on esim 1000 yhteensä. Randomilla aika pieni todennäköisyys osua ei vastattuun ja voi jäädä hakulooppiin pitkäksi aikaa.

Mulla on jo nyt eri taulu joka pitää kirjaa vastatuista kysymyksistä, tallentamalla vastaajan ja kysymyksen IDn sinne.
 
Liittynyt
17.10.2016
Viestejä
481
Ja jos riittää, että saman session aikana ei tule samaa kyssäriä kahdesti, niin tallennat jo näytetyt kysymykset vain sessioon käyttäjälle. Tohon random sampleen on kaikenlaisia tapoja. Joko pidät kirjaa arvotuista ja arvot uuden kun tarvitsee (ei tehokas kun se arvottujen määrä on lähellä koko määrää). Riippuen kielestä, tuota ei edes tarvitse tehdä itse:


Tai sitten teet itse:


Riippuu tosiaan tilanteesta, kuinka hienosti tämä kannattaa ratkoa.
Kiitos. Perehdyn tuohon ja kerron miten kävi.

Tuossa tosiaan vois olla, että session alussa haetaan yhdellä tietokantahaulla kaikki kyseisen käyttäjän vastatut kysymykst ja tallennetaan ne taulukkoon. Sitten käytetään lodashin funktiota, joka hakee aina uniikin numeron kyseisestä taulusta ja tehdään tietokantahaku tämän IDn avulla.
 
Liittynyt
14.12.2016
Viestejä
1 298
Select kysymystauluun joinilla käyttäjältä kysyttyihin kysymyksiin käänteisenä, order by tietokannan random-funtiolla ja rajoitat kyselyn palauttamaan vain yhden rivin (limit 1, fetch 1, tjsp).
 
Liittynyt
17.10.2016
Viestejä
481
Select kysymystauluun joinilla käyttäjältä kysyttyihin kysymyksiin käänteisenä, order by tietokannan random-funtiolla ja rajoitat kyselyn palauttamaan vain yhden rivin (limit 1, fetch 1, tjsp).
Toimii tällä! Hakee kaikki mihin ei ole vastattu.

SELECT * FROM Questions JOIN AnsweredQuestions ON NOT Questions.ID = AnsweredQuestions.QuestionID
 
Liittynyt
14.12.2016
Viestejä
1 298
SQL:lla voi lisätä sen satunnaisuuden lisäksi, ellet lisännyt jo. Tietenkin voit hakea useamman kysymyksen yhden sijasta samalla, jos siihen on tarve.

 
Toggle Sidebar

Statistiikka

Viestiketjut
240 202
Viestejä
4 194 549
Jäsenet
70 871
Uusin jäsen
Hedelma

Hinta.fi

Ylös Bottom