Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di Gio&Ste
    Registrato dal
    Jan 2001
    Messaggi
    643

    query x correlare articoli

    Ho una stringa che contiene delle parole chiave separate semplicemente da uno spazio.
    Vorrei migliorare la query che uso per "correlare" gli articoli che sono contenuti nel db.
    Al momento la query è questa:
    codice:
    Visa ="SELECT * FROM comunica where keys like '%" & key & "%' order by ID desc"
    A priori non sò quante parole chiave possono essere state inserite, al massimo sono 50 caratteri
    Giò

  2. #2
    Utente di HTML.it L'avatar di Gio&Ste
    Registrato dal
    Jan 2001
    Messaggi
    643
    Ho fatto una ricerca sul forum ed ho adattato la mia query in questo modo:

    codice:
    keyw=split(key," ")
    				for i=0 to ubound(keyw)
    				next
    				Visa ="SELECT * FROM comunica where keys like '%" & keyw(i) & "%' order by ID desc"   				RecSet.Open Visa, objConn, adOpenDynamic, adLockOptimistic 
    				if not RecSet.EOF then 
    				do Until RecSet.EOF %>
    				[*]&amp;tipo=<%=RecSet("tipo")%>"><%=RecSet("Titolo")%>
    <%	RecSet.MoveNext
    	Loop
    	RecSet.Close
    	set RecSet=Nothing
    	objConn.Close
    	set objConn=Nothing %>
    ma quando apro la pagina mi viene fuori questo errore
    Indice non incluso nell'intervallo: 'i'
    /stampa/articolo.asp, line 73

    la linea 73 è quella rossa
    Giò

  3. #3
    Utente di HTML.it L'avatar di Gio&Ste
    Registrato dal
    Jan 2001
    Messaggi
    643
    Ci sono riuscito, questo il codice che ho usato:

    codice:
    <% 	Set RecSet = Server.CreateObject("ADODB.recordset")
    				keyw=split(key," ")
    				sql_ins="" 
    				for i=0 to ubound(keyw)
    				sql_ins= sql_ins & " AND keys LIKE '%" & keyw(i) & "%'" 
    				next 
    				Visa ="SELECT * FROM comunica WHERE 1=1 "& sql_ins
    				RecSet.Open Visa, objConn, adOpenDynamic, adLockOptimistic 
    				if not RecSet.EOF then 
    				do Until RecSet.EOF %>
    				[*]&amp;tipo=<%=RecSet("tipo")%>"><%=RecSet("Titolo")%>
    <%	RecSet.MoveNext
    	Loop
    	RecSet.Close
    	set RecSet=Nothing
    	objConn.Close
    	set objConn=Nothing %>
    Vorrei poter escludere l'articolo dal quale provengo, come posso fare? non ho proprio idea.
    Giò

  4. #4
    Utente di HTML.it L'avatar di 99eros9
    Registrato dal
    Jan 2003
    Messaggi
    2,637
    Gio, in questo momento mi trovi seriamente occupato in faccende abbastanza impegnative.
    Se ti può essere utile per risolvere il problema, ti dico subito che ti conviene costruire la query in modo dinamico senza ciclare l'apertura del recordset ad ogni indice dell'array, altrimenti il carico diventa eccessivo.
    Tala är silver men tiga är guld!
    Pubblica il tuo curriculum
    Segnala il tuo sito
    Ancl

  5. #5
    Utente di HTML.it L'avatar di Gio&Ste
    Registrato dal
    Jan 2001
    Messaggi
    643
    Eros quando sarai un pò più libero mi spieghi che vuoi dire con query dinamica?
    Giò

  6. #6
    Utente di HTML.it L'avatar di 99eros9
    Registrato dal
    Jan 2003
    Messaggi
    2,637
    Si tratta di formulare una query in base ai parametri che hai a disposizione.
    Esempio:
    Hai un array con indice 3. Ogni elemento dell´array rappresenta un termine di ricerca da inserire nella clausula WHERE della query.
    Avrai una parte "costante della query", come ad esempio "SELECT * FROM nomeTabella WHERE ", e una parte dinamica che ti andrai a costruire con delle opportune condizioni che controllano lo stato di costruzione della query stessa.

    Esempio
    codice:
    'Hai una funzione che splitta la stringa
    Function split_stringa(stringa)
    Dim strStringa
    strStringa = replace(trim(stringa),",","")
    split_stringa = Split(strStringa," ",-1,1)
    End Function 'split_stringa
    
    'Tale funzione verrá richiamata da questo codice, creando un array
    
    Dim array_stringa
    array_stringa = split_stringa(cmp_ricercaCv)
    Dim array_min
    Dim array_max
    array_min = lBound(array_stringa)
    array_max = uBound(array_stringa)
    
    'Poi ti costruisci la query dinamicamente
    
    Dim sql_dinamica
    Dim sql
    sql = "SELECT * FROM tabella "
    For z = array_min To array_max
    If z = array_min Then
    Select Case array_min
    Case array_max
    sql_dinamica = sql_dinamica & "WHERE ("&_
    "campo_ricerca LIKE '%" & array_stringa( z ) & "%' )"
    Case else
    sql_dinamica = sql_dinamica & "WHERE ("&_
    "campo_ricerca LIKE '%" & array_stringa( z ) & "%' "
    End Select
    Elseif z = array_max then
    sql_dinamica = sql_dinamica & " AND campo_ricerca LIKE '%" & array_stringa( z ) & "%' )"	
    Else 
    sql_dinamica = sql_dinamica & " AND campo_ricerca LIKE '%" & array_stringa( z ) & "%' "
    End If
    Next
    
    'e alla fine componi il tutto
    sql = sql & sql_dinamica
    'sql sará la query completa, a prescindere dall'indice dell´array.
    L'esempio puoi prenderlo come spunto, anche se non credo sia funzionante. Piú di cosí non saprei spiegarti, Gio!
    heydå!
    Tala är silver men tiga är guld!
    Pubblica il tuo curriculum
    Segnala il tuo sito
    Ancl

  7. #7
    Utente di HTML.it L'avatar di Gio&Ste
    Registrato dal
    Jan 2001
    Messaggi
    643
    Grazie per l'esempio eros, l'ho sistemato, sembra funzionare. Ma mi estrae cmq tutti gli articoli presenti nel db.
    Il dubbio che mi sorge è che considera anche lo spazio come carattere da ricercare.

    Così mentre con il codice di prima mi estrae solo i dati in cui due record hanno le stesse parole come keyword
    Giò

  8. #8
    Utente di HTML.it L'avatar di 99eros9
    Registrato dal
    Jan 2003
    Messaggi
    2,637
    usa la funzione TRIM()

    Poi nel mio esempio ho preso come valore di divisione "," mentre tu dovrai prendere " ".
    Tala är silver men tiga är guld!
    Pubblica il tuo curriculum
    Segnala il tuo sito
    Ancl

  9. #9
    Utente di HTML.it L'avatar di Gio&Ste
    Registrato dal
    Jan 2001
    Messaggi
    643
    Non sto proprio riuscendo a metterlo a posto!!

    Se il record che estraggo ha più parole chiave degli altri mi compare solo quel record. Mi sembra che in questo modo non funzioni molto bene.
    Non sto riuscendo a trovare neanche un esempio!
    Giò

  10. #10
    Utente di HTML.it L'avatar di Gio&Ste
    Registrato dal
    Jan 2001
    Messaggi
    643
    La cosa che dovrebbe fare è eseguire la query per ogni parola chiave, confrontare i risultati e stampare solo 1 volta i risulati.

    E' più chiaro quello che voglio fare?
    Giò

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.