Newsgroup: it.comp.www.asp
Titolo: Restituire i valori in ordine ESATTO da un query

Ciao a tutti,
Ho una query tipo "SELECT * FROM Users". Devo estrarre *casualmente* 3
utenti dalla tabella, quindi prima mi calcolo 3 numeri casuali e poi
aggiungo un WHERE, tipo "SELECT * FROM Users WHERE ID=7 OR ID=2 OR ID=5".
Il problema è che mi vengono restituiti correttamente gli utenti 7, 2 e 5,
ma SEMPRE nell'ordine 2, 5, 7, in sostanza mi vengono sempre restituiti
ordinati. Io voglio riceverli nell'ordine che ho specificato e cioè 7,2,5.
C'è qualche modo per fare ciò?
Grazie,
poi

 Grazie,
La prima soluzione che mi č venuta in mente č:
SELECT * FROM Users WHERE ID=7 union
SELECT * FROM Users WHERE ID=2 union
SELECT * FROM Users WHERE ID=5
Non molto performante ma dovrebbe andare.
Ciao
--
AZ 

 Non molto performante ma dovrebbe andare.
Grazie per la risposta, ma il numero di record da estrarre casualmente non è
fissato, può variare da 1 a 200 (lo sceglie a runtime dall'utente). Quindi
mi immagino una query composta da 200 sottoquery... come sarà lenta!
poi

 mi immagino una query composta da 200 sottoquery... come sarà lenta!
Non ho capito. Per 200 intendi 200 ID diversi? Quindi la query potrebbe 
essere così?
SELECT * FROM Users WHERE
ID=7 OR ID=2 OR ID=5 OR ID=9 or ID=10 OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x OR
ID=x OR ID=x OR ID=x OR ID=x or ID=x
(200 valori di ID)
Ho capito bene? Perché con la union puoi estrapolare anche migliaia di 
record solo che devi litare il numero di select  *unite*...
Ciao
--
AZ

 
200? Ma mica farai "OR ID=" per 200 volte?
Fai un WHERE ID IN (1,5,9...

 Fai un WHERE ID IN (1,5,9...
Vero, questa modifica l'ho fatta subito dopo aver inviato il msg nel NG;
rimane però il problema dell'ordinamento esatto.
Grazie,
poi

 record solo che devi litare il numero di select  *unite*...
"Litare"? :-) Cosa intendi, limitare?
In sostanza è un pagina che deve mostrare un quiz all'utente; il db MDB
contiene 500 domande e all'utente viene chiesto quante domande vuole
svolgere (da 2 a 200). Poi devo estrarre casualmente il numero di domande
scelte dall'utente e mostrargliele.
Grazie,
poi

 Grazie,
Ok, allora ti consiglio di usare il where id in... e il risultato della 
query memorizzalo in un array di 200 elementi (vedi il metodo getrows del 
recordset, su aspitalia nella sezione uno script al giorno ne trovi un 
esempio).
Quindi prende il record/domanda direttamente dall'array con l'ordine che 
vuoi tu:
Response.Write (array(9) )
Response.Write (array(2) )
Response.Write (array(12) )
Response.Write (array(45) )
Mi sembra la soluzione ottimale.
Ciao
--
AZ 

 Mi sembra la soluzione ottimale.
Hey, č una soluzione nuova! Grazie, ora provo ad implementarla e vedere un
po' le performance!
Ciao,
poi

 Mi sembra la soluzione ottimale.
Solo per pignoleria... :-P
è più compatto scrivere:
sSql = "SELECT * " & _
           "FROM tabella " & _
           "WHERE id IN (" & Join(array, ", ") & ");"
--
Filippo Di Blasi 
filippo...@puntoinformatico.it
http://www.puntoinformatico.it
 <-- E-shop informatico
http://puntoinformatico.it/usato
 <-- Usato
http://puntoinformatico.it/servizi
 <-- Servizi web
http://puntoinformatico.it/download
 <-- Driver & Trial
http://puntoinformatico.it/news
 <-- News & Glossario

 aggiungo un WHERE, tipo "SELECT * FROM Users WHERE ID=7 OR ID=2 OR ID=5".
(se hai nel db una funzione che genera un numero casuale...)
Select 
Rand(), [altri campi]
    from Users
Order by 1
LIMIT 0,3
o 
SELECT TOP 3
RAND(), [altri campi]
    from users
Order By 1
su Ciccio-SQLServer
L'ordine è quello di memorizzazione nella tabella, la select NON fa 
nessun ordinamento aggiuntivo.
E' la spiegazione del 
Select TOP 100 PERCENT nelle viste se vuoi un ordinamento...
ciauzzzz