Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168

    Vi chiedo un aiuto su SELECT MAX

    Ciao a tutti,
    ho la seguente stringa che mi estrae un "IDopera" random tra tutti i record della tabella opere:

    codice:
    <% 
    ' apertura conn 
    Set Conn = Server.CreateObject("ADODB.Connection")
    strConn="driver={Microsoft Access Driver (*.mdb)};"
    strConn=strConn & "DBQ=" &Server.MapPath("/mdb-database") & "\miodatabase.mdb"
    Conn.Open strConn
    
    ' query SQL 
    strSQLMax = "SELECT Max(IDopera) as MaxVal FROM opere" 
    strSQL = "SELECT Top 1 * FROM opere Where filename_p <> '' AND filename_g <> '' AND IDopera = " 
    
    ' estrai valore massimo 
    Set rs = conn.Execute(strSQLMax) 
    intMax = rs("maxVal") 
    rs.Close 
    set rs = Nothing 
    ' genera valora casuale 
    Randomize() 
    intRandom = CInt ((Rnd() * intMax) + 1) 
    ' estrai record 
    Set rs = conn.Execute(strSQL & intRandom) 
    ' visualizza in qualche modo 
    
    %>
    Come faccio a fare in modo che il record random mi venga estratto tra le sole opere di un determinato autore? Ho provato aggiungendo una clausola WHERE artista = 'pippo' alla prima stringa di connessione (dove dice SELECT MAX) ma senza successo...

    Mi potreste gentilmente postare la stringa corretta?

    Grazie mille per l'aiuto, ciao ciao!

    t.

  2. #2
    ma perkè usi MAX sul'ID???

    non fai prima a fare
    select Idoperara from opere where autore = "nome"

    in questo modo lui ti riporta già in automatico l'id più alto...

    il Max ti serve x trovare il valore più alto ma se sparso... in questo caso si tratta dall'ID che immagino sia incrementale, quindi non ti serve il max... :S
    Ah, Jedis! I had no ideas! What can i do for you, honored Jedis?

    I'm not Jedi. I'm a guy with a lighsaber and a few questions.

  3. #3
    Originariamente inviato da Killer99
    ma perkè usi MAX sul'ID???

    non fai prima a fare
    select Idoperara from opere where autore = "nome"

    in questo modo lui ti riporta già in automatico l'id più alto...

    il Max ti serve x trovare il valore più alto ma se sparso... in questo caso si tratta dall'ID che immagino sia incrementale, quindi non ti serve il max... :S
    non è esatto: la tua select riporta tutti gli id di tutte le opere con autore uguale al tizio...o fai

    codice:
    select max(id) as idmax from tabella where autore='tizio'
    oppure fai

    codice:
    select top 1 id from tabella where autore='tizio' order by id desc

  4. #4
    quello che dici tu lo fa solo se ci fai un ciclo, se non fai il ciclo ti da solo ed esclusivamente 1 valore... -_-''
    Ah, Jedis! I had no ideas! What can i do for you, honored Jedis?

    I'm not Jedi. I'm a guy with a lighsaber and a few questions.

  5. #5
    Originariamente inviato da Killer99
    quello che dici tu lo fa solo se ci fai un ciclo, se non fai il ciclo ti da solo ed esclusivamente 1 valore... -_-''
    killer

    se leggi in cima c'è scritto

    Come faccio a fare in modo che il record random mi venga estratto tra le sole opere di un determinato autore?
    indi vuole 1 solo record

    --------------------------------------------------------------

    io comunque farei così

    1. SELEZIONARE L'ID PIU' GRANDE
    2. CALCOLARE UN NUMERO CASUALE FRA 1 E QUESTO ID
    3. FARE UNA QUERY TOP 1 CON ID > IDrand

    es:

    codice:
    SQL = "SELECT TOP 1 id FROM tabella WHERE autore = 'tizio' ORDER BY id DESC"
    set rs = conn.execute(SQL)
    idmax = rs("id")
    
    randomize time
    idsel = int(rnd*idmax)+1
    
    SQL = "SELECT TOP 1 id FROM tabella WHERE autore = 'tizio' AND id >= " & idsel & " ORDER BY id"
    set rs = conn.execute(SQL)
    idrnd = rs("id")
    e dentro IDRND ti trovi un ID preso casualmente fra tutti i record di quell'autore

    --------------------------

    ovviamente oltre al limite del random di un computer, c'è aggiunta la non linearità di distribuzione dei record, dato che ci sono più autori...

    si può ovviamente affinare per avere valori più casuali, se ti serve opero, se invece risolve il tuo problema e ti va bene così, tutti felici
    san imente saluta

    * http://simonecingano.it *

  6. #6
    imente, il tuo ragionamento fa un po' d'acqua...

    se l'autore tizio ha gli id 34, 67 e 123, con max ottengo 123, e con random un numero *qualunque* tra 1 e 123... quindi anche - ad esempio - 92, a cui però non corrisponde un record di tizio!

    andrebbero caricati tutti gli id di tizio in un array, fare una random con l'ubound dell'array, e poi leggere l'id nella posizione random.

  7. #7
    Originariamente inviato da optime
    imente, il tuo ragionamento fa un po' d'acqua...

    se l'autore tizio ha gli id 34, 67 e 123, con max ottengo 123, e con random un numero *qualunque* tra 1 e 123... quindi anche - ad esempio - 92, a cui però non corrisponde un record di tizio!
    leggessi mannaggina a te :P
    WHERE autore = 'tizio' AND id >= " & idsel & "


    Originariamente inviato da optime
    andrebbero caricati tutti gli id di tizio in un array, fare una random con l'ubound dell'array, e poi leggere l'id nella posizione random.
    certo, questa è la soluzione standard...
    è un po' più lenta ma efficace
    e sicuramente da un random molto più "corretto"
    san imente saluta

    * http://simonecingano.it *

  8. #8
    Originariamente inviato da imente
    killer

    se leggi in cima c'è scritto



    indi vuole 1 solo record
    esatto quindi quello da me scritto è giusto... :S

    è una cosa che sonosco da quando scrivo codice...
    se non fai un ciclo, e usi quella qry lui restituisce 1 solo valore....
    quindi è inutile fare top 1 o max(id)
    se invece fai un ciclo, è stupido... cos'è fai un ciclo con top 1 !?!?!?

    tanto per dimostrare che ho ragione...
    http://test.coretech.it/sito/news_test.asp
    come vedete tira fuora 1 sola news... e questo è il codice della pagina:
    codice:
    <%
    dim rs
    set rs=server.CreateObject("ADODB.RecordSet")
    dim sql
    id=Request.QueryString("id")
    sql="select * from news "
    rs.Open sql, cn,1,3
    %>
    <table width="100%" border="0" cellpadding="0" height="47">
            <tr> 
              <td width="2%" valign="top" height="50"></td>
              <td width="5%" valign="top" height="50">','News','scrollbars=yes,resizable=yes,width=620,height=500')">[img]images/ico_file.gif[/img]</td>
              <td colspan="2" valign="top" width="93%" height="50"> 
                <p class="titolonews"><span class="DATA_NEWS"><%=rs("data")%></span><font face="Arial" size="2"><span class="testo11"> 
                  -</span> <font color="#4C85BC">
                  <%
                  if Request.Cookies("coretech") = "" then
                  Response.write rs("titolo")
                  else
                  %>"><%=rs("titolo")%>
                  <%end if%>
                  </font> 
    
                  <span class="testo11">
                  <%'url e link
    
    stringa = rs("news")
    stringa=replace(stringa,chr(13)," 
    ")
    stringa=replace(stringa,vbcrlf," ")
    stringa=replace(stringa,vblf," ")
    arrstringa = split(stringa," ")
    
    for each word in arrstringa
    	if instr(word,"http://www.") then
    	response.write "" & word & " "
    	elseif instr(word,"www.") then
    	response.write "" & word & " "
    	elseif instr(word,"http://") then
    	response.write "" & word & " "
    	elseif instr(word,"@") then
    	response.write "" & word & " "
    	else
    	response.write word & " "
    	end if
    next
    %>
    </span></font></p>
                </td>
            </tr>
          </table>
          <%
          rs.Close
          set rs=nothing
          cn.close
          set cn=nothing
          
          Response.write SQL
          Response.end
    %>
    Ovviamente ha preso la prima news che ha trovato, basta fare order by id desc...
    e il gioco è fatto...


    Ah, Jedis! I had no ideas! What can i do for you, honored Jedis?

    I'm not Jedi. I'm a guy with a lighsaber and a few questions.

  9. #9
    ahhhhh

    certo

    sono d'accordo con te

    il fatto è che se fai TOP1 il tuo recordset avrà 1 record

    se non lo fai il tuo recordset può avere anche centinaia di record
    certo che usi solo il primo, ma è stato popolato in toto

    tutto ciò pesa, e può anche pesare molto sulle prestazioni (una tabella da 50.000 record comincia a dare fastidio)

    con TOP1 il problema non si pone

    capì?
    san imente saluta

    * http://simonecingano.it *

  10. #10
    Originariamente inviato da imente
    leggessi mannaggina a te :P
    WHERE autore = 'tizio' AND id >= " & idsel & "
    mannaggina a me, mi ero perso il " >= " . ok, buona - poi si entra nel gioco della distribuzione dei valori nell'arco della tabella, come hai già detto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.