Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    Problema ordinamento SELECT per un motore

    Descrivo prima l'ambiente in modo da rendere chiaro il problema.

    Ho una tabella con un campo descrizione (Desc).
    Attualmente faccio riempire dall'utente un campo ricerca (CmpRic) e poi applico il risultato creando una select in questo modo:
    SQL = "SELECT * From MyTable where InStr(LCase(Desc),LCase('"&CmpRic&"'))<>0"

    Questo è funzionante se l'utente ricerca ad esempio:
    "Roma"
    "Pizzeria"
    "Piazza Verdi"

    ma non funziona se si cerca:
    "ristoranti di roma"
    "sartorie camicerie"
    ovviamente nel campo descrizione non ho una frase esatta di questo tipo.

    Per ovviare ho intenzione di creare un array con tutte le parole (escludendo magari le parole di 3 caratteri o meno) e fare una query di questo tipo:
    SQL = "SELECT * From MyTable where InStr(LCase(Desc),LCase('"&Arr(0)&"'))<>0 OR InStr(LCase(Desc),LCase('"&Arr(1)&"'))<>0"

    La mia select ora avrà tutti i record con almeno una parola ricercata.

    A questo punto ho il problema di come ordinare i record ricevuti.
    La necessità è quella di avere prima tutti i record con più parole trovate andando a scendere. In pratica quello che fanno i motori di ricerca.

    Come posso fare? Magari è possibile avere lo stesso risultato senza l'utilizzo degli Array?

    Grazie
    Io nella vita ho visto cose che voi astemi neanche potete immaginare.

  2. #2
    Devi usare l'operatore LIKE e, inoltre, dividere la stringa di ricerca in più parole, ed ogni parola deve essere una parte della clausola di ricerca.
    codice:
    testo = "pizzeria bella napoli"
    
    sql = "SELECT * FROM tabella1 WHERE "
    
    if inStr(testo," ") > 0 then
      testo = split(testo," ")
        for i = 0 to uBound(testo)
          sql = sql & "campo1 LIKE '%" & testo(i) & "%' "
          if i < uBound(testo) then sql = sql & "AND "
        next
    else
      sql = sql & "campo1 LIKE '%" & testo & "%' "
    end if
    
    sql = sql & "ORDER BY campo2"
    In questo modo otterrai:
    codice:
    SELECT * FROM tabella1 WHERE campo1 LIKE '%pizzeria%' AND campo1 LIKE '%bella%' AND campo1 LIKE '%napoli%' ORDER BY campo2

  3. #3
    ho provato il tuo consiglio creando questa funzione
    function PopolaRicerca(QueRic,MyCampo)
    Qsql = ""
    QArray = split(QueRic," ")
    for Qi = 0 to uBound(QArray)
    Qsql = Qsql & MyCampo & " LIKE '%" & QArray(Qi) & "%' "
    if Qi < uBound(QArray) then Qsql = Qsql & "AND "
    next
    PopolaRicerca=Qsql
    end function

    funziona bene ma se l'archivio non ha nessuna delle richieste mi torna un recordset pieno di campi nulli.
    Come mai?
    Io nella vita ho visto cose che voi astemi neanche potete immaginare.

  4. #4
    Se QueRic non ha spazi vuoti cosa succede?

  5. #5
    scusa ... avevo fatti una ca..ata io

    Comunque ho un problemino:
    Se richiedo "bella napoli" funziona (perchè ho dei record con "bella napoli")

    Se chiedo "belle napoli" non torna una mazza ... eppure sono pieno di record con napoli e con belle

    Quindi questo lavoro mi è servito per rimanere al punto di partenza ... dove sbaglio?
    Io nella vita ho visto cose che voi astemi neanche potete immaginare.

  6. #6
    trovato!
    al posto di AND metto OR
    ciauz
    Io nella vita ho visto cose che voi astemi neanche potete immaginare.

  7. #7
    codice:
    if Qi < uBound(QArray) then Qsql = Qsql & "OR "

  8. #8
    benissimo ...
    Ora però dovrei indicizzarli portando in alto quelli con più parole ... credo che non si può ... che dici?

    Per vedere come funziona vai su google e cerca "RISTORANTE FARAONE GIUGLIANO"
    Clicca sul link Club FraWeb e guarda la pagina:
    Si è presa la query di google e l'ha usata nella ricerca della pagina
    Io nella vita ho visto cose che voi astemi neanche potete immaginare.

  9. #9
    Quello si chiama page ranking.
    Qualche tempo fa qua c'è stata una discussione su questo argomento con la soluzione.
    Prova a cercare.

  10. #10
    ... mi esce un mondo!

    Comunque, a parte l'utilizzo che ne sto facendo ... esiste un modo di riordinare questa select appena ottenuta?

    Questa soluzione è applicabile per moltissime altre situazioni
    Io nella vita ho visto cose che voi astemi neanche potete immaginare.

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.