Estrarre record in modo casuale da database

snakefrancesco

Utente Attivo
4 Mag 2008
33
0
0
Salve a tutti amici di Mr.Webmaster! Allora io ho un sito in asp con un database Access, nella home page compaiono 6 immagini con titolo che rappresentano gli ultimi articoli divisi per categoria, ora io vorrei sapere se c'è un modo per far si che i 6 articoli non siano gli ultimi ma siano presi a caso dal database. vi mostro il mio codice:

Codice:
<%Set RS = Server.CreateObject("ADODB.Recordset")
RS.ActiveConnection = con
sqlString = "SELECT articoli.id as iddo, articoli.titolo, console.nome, autori.nome, articoli.foto1, articoli.paragrafo1 FROM (articoli LEFT JOIN autori ON articoli.autore = autori.id) LEFT JOIN console ON articoli.console = console.id where articoli.redazionale <> 3 order by articoli.foto1 desc, articoli.id desc "
RS.open sqlString
foto = rs("foto1")
if foto = "" or isnull(foto) then 
foto = "vuota.jpg"
end if
%>
<%Set RSa = Server.CreateObject("ADODB.Recordset")
RSa.ActiveConnection = con
sqlString = "SELECT articoli.id as iddo, articoli.titolo, console.nome, autori.nome, articoli.foto1, articoli.paragrafo1 FROM (articoli LEFT JOIN autori ON articoli.autore = autori.id) LEFT JOIN console ON articoli.console = console.id where articoli.redazionale = 2 order by articoli.id desc"
RSa.open sqlString
foto2 = rsa("foto1")
if foto2 = "" or isnull(foto2) then 
foto2 = "vuota.jpg"
end if
%>
<%Set RSb = Server.CreateObject("ADODB.Recordset")
RSb.ActiveConnection = con
sqlString = "SELECT articoli.id as iddo, articoli.titolo, console.nome, autori.nome, articoli.foto1, articoli.paragrafo1 FROM (articoli LEFT JOIN autori ON articoli.autore = autori.id) LEFT JOIN console ON articoli.console = console.id where articoli.redazionale = 5 order by articoli.id desc"
RSb.open sqlString
foto3 = rsb("foto1")
if foto3 = "" or isnull(foto2) then 
foto3 = "vuota.jpg"
end if
%>
<%Set RSc = Server.CreateObject("ADODB.Recordset")
RSc.ActiveConnection = con
sqlString = "SELECT articoli.id as iddo, articoli.titolo, console.nome, autori.nome, articoli.foto1, articoli.paragrafo1 FROM (articoli LEFT JOIN autori ON articoli.autore = autori.id) LEFT JOIN console ON articoli.console = console.id where articoli.redazionale = 9 order by articoli.id desc"
RSc.open sqlString
foto4 = rsc("foto1")
if foto4 = "" or isnull(foto2) then 
foto4 = "vuota.jpg"
end if
%>
<%Set RSd = Server.CreateObject("ADODB.Recordset")
RSd.ActiveConnection = con
sqlString = "SELECT articoli.id as iddo, articoli.titolo, console.nome, autori.nome, articoli.foto1, articoli.paragrafo1 FROM (articoli LEFT JOIN autori ON articoli.autore = autori.id) LEFT JOIN console ON articoli.console = console.id where articoli.redazionale = 10 order by articoli.id desc"
RSd.open sqlString
foto5 = rsd("foto1")
if foto5 = "" or isnull(foto2) then 
foto5 = "vuota.jpg"
end if
%>
<%Set RSe = Server.CreateObject("ADODB.Recordset")
RSe.ActiveConnection = con
sqlString = "SELECT articoli.id as iddo, articoli.titolo, console.nome, autori.nome, articoli.foto1, articoli.paragrafo1 FROM (articoli LEFT JOIN autori ON articoli.autore = autori.id) LEFT JOIN console ON articoli.console = console.id where articoli.redazionale = 8 order by articoli.id desc"
RSe.open sqlString
foto6 = rse("foto1")
if foto6 = "" or isnull(foto2) then 
foto6 = "vuota.jpg"
end if
%>
<%Set RSf = Server.CreateObject("ADODB.Recordset")
RSf.ActiveConnection = con
sqlString = "SELECT articoli.id as iddo, articoli.titolo, console.nome, autori.nome, articoli.foto1, articoli.paragrafo1 FROM (articoli LEFT JOIN autori ON articoli.autore = autori.id) LEFT JOIN console ON articoli.console = console.id where articoli.redazionale = 7 order by articoli.id desc"
RSf.open sqlString
foto7 = rsf("foto1")
if foto7 = "" or isnull(foto2) then 
foto7 = "vuota.jpg"
end if
%>
<%Set RSg = Server.CreateObject("ADODB.Recordset")
RSg.ActiveConnection = con
sqlString = "SELECT articoli.id as iddo, articoli.titolo, console.nome, autori.nome, articoli.foto1, articoli.paragrafo1 FROM (articoli LEFT JOIN autori ON articoli.autore = autori.id) LEFT JOIN console ON articoli.console = console.id where articoli.redazionale = 3 order by articoli.id desc"
RSg.open sqlString
foto8 = rsg("foto1")
if foto8 = "" or isnull(foto2) then 
foto8 = "vuota.jpg"
end if
%>

Ciao a tutti e grazie:fonzie:
 
Ciao Francesco!

Prova ad utilizzare innanzitutto un solo Recordset (prima che IIS ti picchi a sangue) ed usa una queri del genere:

SELECT TOP 6 * FROM tabella ORDER BY RND(campo_numerico)

Dunque:

- TOP 6 ti estrae solo 6 record;

- alla funzione RND devi passare un campo numerico, ad esempio l'ID della tabella.

Ho sepre fatto questa cosa con MySQL e non con Access, quindi non sono certo che funzioni... ad occhio mi pare la soluzione... in caso: poi vediamo ;)
 
Luke ho fatto come mi hai detto ho messo order by RND(articoli.id) mi ha preso degli articoli a caso ma solo una volta, cioè se faccio refresh non cambiano restano sempre gli stessi. Anche se riavvio il browser prende sempre quelli.

Cosa posso fare?
 
La butto giù cosi, magari per adattarlo alle tue esigenze devi fare un ritocchino qui e li... non so!

Testa e fammi sapere ;)

<%
rs.Open "SELECT TOP 6 * FROM tabella ORDER BY RND(id)", cn, 1
While rs.EOF = False
Response.Write rs("nome_campo") & "<br>"
rs.MoveNext
Wend
rs.Close
%>
 
Non riesco ad adattarlo io avevo fatto così:

Codice:
<%Set RSa = Server.CreateObject("ADODB.Recordset")
RSa.ActiveConnection = con
sqlString = "SELECT articoli.id as iddo, articoli.titolo, console.nome, autori.nome, articoli.foto1, articoli.paragrafo1 FROM (articoli LEFT JOIN autori ON articoli.autore = autori.id) LEFT JOIN console ON articoli.console = console.id where articoli.redazionale = 2 order by rnd(articoli.id)"
RSa.open sqlString
foto2 = rsa("foto1")
if foto2 = "" or isnull(foto2) then 
foto2 = "vuota.jpg"
end if
%>

Mi serve che estragga un solo record casualmente.

Ciaooo Luke fammi sapere:byebye:
 
Luke ho fatto come mi hai detto ho messo order by RND(articoli.id) mi ha preso degli articoli a caso ma solo una volta, cioè se faccio refresh non cambiano restano sempre gli stessi. Anche se riavvio il browser prende sempre quelli.

Cosa posso fare?

Dato questo tuo messaggio pensavo ne volessi estrarre N, non uno solo...

In ogni caso, a questo punto, elimina il ciclo ed inizia a testare direttamente su Access la query che ti ho postato e vedi, testandola più di una volta, se il risultato che ti tira fuori è sempre lo stesso o meno.

Se con l'istruzione SQL non la risolviamo, passiamo alla soluzione-ASP.

Fammi sapere!
 
Allora sto testando su Access questa query:

SELECT TOP 6 * FROM articoli ORDER BY RND(id)

Funziona mi prende sempre 6 articoli diversi.

Poi ho provato sempre in Access questa query:

SELECT articoli.id as iddo, articoli.titolo, articoli.foto1, articoli.paragrafo1 FROM articoli where articoli.redazionale = 2 order by rnd(articoli.id);

Funziona mi prende un solo articolo filtrato per redazionale che sarebbe la tipologia dell'articolo.

Ho notato una cosa però, riprovando il codice su internet ho scoperto che facendo refresh non cambia l'articolo però è diverso da quello dell'altra volta...quindi che significa? che ogni volta che accendo il pc cambia? oppure ogni giorno? non so...:confused:
 
Sicuramente non devi usare la clausola TOP, oppure settala su 1, oppure se non fai il ciclo puoi anche non suarla: non se se il motore Jet di Access si sforza di più o di meno... non se, vedi se usarlo (settato su 1) o meno.

Venendo al punto, se funziona sul tuo computer dovrebbe (e sottolineo il condizionale) funzionare ovunque al refresch, ovvero ogni volta che la query viene eseguita.

Attenzione: se hai 3 record potrebbe anche sembrare, su 5 refresh ad esempio, che ti carichi sempre lo stesso; potrebbe essere una caso! Se invece hai decine o centinaia di record e su 10 refresh ti prende sempre lo stesso, per il calcolo delle probabilità è facile immaginare che ci sia un problema.

Fai un altro test monitorando attentamente la query che esegui, testala su Access, offline, online e fammi sapere.

Se ancora non va tagliamo la testa a quella povera bestia del toro e passiamo al piano B!
 
Per ora insieme allo staff abbiamo deciso di fare diversamente, quindi per il momento fermo gli esperimenti, però resto curioso, chissà forse più avanti testerò più a fondo questo argomento.

Alla prossima Luke:ilpirata:
 

Discussioni simili