Autore Topic: ricerche condizionate (complesse) con SQL  (Letto 574 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
ricerche condizionate (complesse) con SQL
« il: 03 Febbraio 2017, 14:08:09 »
vorrei restituire all'utente del mio programma i risultati di una query "complessa" fatta al database.
Ovvero l'utente potrebbe chiedere di vedere tutti i file audio che sono (per esempio): rock AND pop NOT italiani

nel record di ogni canzone nel db c'e' un campo tag (stringa) in cui sono elencati i tag che gli sono propri: rock  folk OPPURE italiana tradizionale tarantella OPPURE italiana sanremo

con "select * from canzoni where tag like '%" & filtro & "%'" me la cavo bene con un tag singolo, ma per ricerche piu' complesse e' un problema ....
Come posso fare una ricerca condizoinata con una stringa di ricerca arbitraria (ma formalmente corretta)?
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #1 il: 03 Febbraio 2017, 15:03:39 »
Io farei così:
Prima con un Like di Gambas cerchi nella stringa le parole chiave per la tua query e poi interroghi a dovere il database.

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #2 il: 03 Febbraio 2017, 17:20:10 »
 :P

io pensavo di fare cosi':
1) scansionare la stringa di filtro per individuare i vari "token" NON logici (ovvero i tag), sostituire ad ognuno se-stesso con davanti e dietro la wildcard % (questo perche' alle volte nei tag mp3 ci infilano anche l'indice del tag di genere, per esempio unknown e' alle volte unknown (255) ... )
2) fare un search con il nuovo filtro: select * from canzoni where tag like %'primo_tag'% spazio Primo_operatore_logico spazio %'secondo_tag'% spazio Secondo_operatore_logico spazio ... etc etc


se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #3 il: 03 Febbraio 2017, 17:28:46 »
:P

io pensavo di fare cosi':
1) scansionare la stringa di filtro per individuare i vari "token" NON logici (ovvero i tag), sostituire ad ognuno se-stesso con davanti e dietro la wildcard % (questo perche' alle volte nei tag mp3 ci infilano anche l'indice del tag di genere, per esempio unknown e' alle volte unknown (255) ... )
2) fare un search con il nuovo filtro: select * from canzoni where tag like %'primo_tag'% spazio Primo_operatore_logico spazio %'secondo_tag'% spazio Secondo_operatore_logico spazio ... etc etc

Senti restare sul teorico è praticamente inutile, se vuoi che mi cimento in una query fammi un esempio reale con nomi di campo e tag che immagino possano essere sommati per ricerche multiple e così toccherai con mano che io di database ne capisco veramente poco  ;D
Anzi potresti mettere in palio un premio per chi propone la query più bella  :P
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #4 il: 03 Febbraio 2017, 17:40:08 »
Codice: [Seleziona]
Public Function ValidateStrategyFilter(strategia As String) As Boolean
Dim Operatori As New String[]
Dim Operandi As New String[]
Dim Stringa As String

  If strategia = "" Then Return False

 
  For Each stringa In Split(strategia, " ")
    stringa = Trim(stringa)
    If (LCase(stringa) = "AND") Or (LCase(stringa) = "OR") Or (LCase(stringa) = "NOT") Then
      Operatori.Add(UCase(stringa))
      Else
        Operandi.Add(LCase(stringa))
    Endif
  Next
 
  If (Operandi - Operatori) <> 1 Then Return False
 
  Return True
End
il problema e' che in teoria ci potrebbero essere casi particolari come:
italiani AND rock AND NOT 80

oppure

NOT sanremo

........

il primo (italiani AND rock AND NOT 80) potrei costringerli a scrivere (italiani AND rock NOT 80), ma il secondo?


...servirebbe un parser gia' costruito ... una grande sfida del 900

« Ultima modifica: 03 Febbraio 2017, 17:45:27 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #5 il: 03 Febbraio 2017, 17:58:44 »
Ma francamente non so come è organizzata la tua finestra, io farei qualcosa tipo voci che possono essere spuntate (CheckBox) in modo utile per costruire la frase di interrogazione.
Ma tu vuoi aiuto per la query o per l'organizzazione della finestra?

voglio dire:
Non importa quello che vede l'user poi tu organizzi le cose in modo logico per creare l'interrogazione, l'importante è non dare campo libero all'user.

Oppure non ho capito cosa chiedi?

 :ciao:
« Ultima modifica: 03 Febbraio 2017, 18:21:41 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #6 il: 12 Febbraio 2017, 20:29:50 »
eh .... il problema Gianluigi e' proprio quello.
Vorrei dare campo libero all'utente (fino ad un certo punto).

Nel mio vecchio sistema di automazione radiofonica le canzoni potevano essere classificate in una SOLA categoria tra quelle che il direttore artistico creava.

Oggi vorrei andare OLTRE ed usare l'idea googliana dei TAG, per poter fare ricerche piu' complesse che in base ai dati (e la maestria del cercatore) restituisce valori vicini alle aspettative dell'utente.

Mi potresti dire "chiedi a google come fa'", :D, ma molto piu' banalmente vorrei sapere se esiste un modulo, un componente o un algoritmo copiaincollabile, che i possa restituire una query sql ben formattata dai "tag" (si spera) logicamente concatenati, immessi dall'utente ;-)

sed? altro parser utile secondo la vostra esperienza?

per ora mi leggo questa pagina: https://blog.imaginea.com/mysql-query-parsing/
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #7 il: 12 Febbraio 2017, 21:51:43 »
Intanto mi corre l’obbligo di ricordarti che io sono tutt’altro che un esperto di database e di interrogazioni ciò detto, se io dovessi complicarmi la vita come vuoi fare tu, partirei sempre e comunque dalle parole chiave.
Vale a dire prima cercherei tutte le parole chiave che in base alla costruzione del tuo database, tabelle (relazioni) e campi mi permettano di preconfezionare le interrogazioni con criterio, poi cercherei tutti i sinonimi delle parole chiave e quindi attraverso il LIKE di Gambas punterei ad una particolare costruzione prefabbricata di query fra le tante già prefabbricate.
Per poter fare un esempio pratico, ammesso che ne fossi capace, dovrei conoscere come sono costruite le tabelle del tuo database e conoscere meglio SQL ma tanto per dire potresti cercare con LIKE nella libera frase dell’utente tutti i tipi di negazione: senza non escluso contrario opposto  che diventerà NOT, estrarre: e anche pure ed ancora che diventerà AND e così andare per tutte le parole chiave a te utili,  tutte le parole che rappresentano i campi o i loro sinonimi ecc. poi come detto cerchi l’interrogazione preconfezionata (e funzionante) che più si avvicina a quello trovato nella frase scritta dall'utente e la dai in pasto al database.
L’interrogazione prima dovrà essere completata dai campi e tabelle e il gioco è fatto e magari puoi anche riferire mostrandogliela all’utente in forma comprensibile come hai interpretato la sua domanda in modo che capisca il meccanismo di traduzione.
Per me è l’unico modo, altrimenti se cerchi di creare un’interrogazione direttamente da quello inserito non ne esci.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #8 il: 12 Febbraio 2017, 21:57:26 »
si e' proprio una cosa complicata.

Pero' mi hai fatto venre in mente una possibile soluzione.

Fare una "finestra delle strategie", con un form a scorrimento in cui ci sono TUTTI i tag che sono stati inseriti nel DB per tutte le canzoni (eliminando le ripetizioni saranno qualche decina) e mettere un bottone a tre stati:
DISABILITATO=non ne tiene conto
ON=deve esserci nella strategia
OFF=NON deve esserci nella strategia.

L'utente puo' aggiungere un eventuale campo tag ulteriore, che generera' un altro tasto 3-state che andra' in fondo alla lista e potra' essere manipolato come gli altri,

thanks, una soluzione soddisfacente :D
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #9 il: 12 Febbraio 2017, 22:15:21 »
Se cerchi un widget tre stati guarda un po il programma BrokenCode restituitomi da Bodard in questa discussione della ML, forse potrebbe servirti

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #10 il: 12 Febbraio 2017, 22:26:23 »
Potresti trovare la maniera di mettere le varie condizioni in parentesi nidificate.
Ad es. ((italiani AND rock) NOT 80) NOT sanremo. In questo caso prima verrebbero selezionati i brani rock italiani, poi verrebbero esclusi i brani anni '80, poi verrebbero esclusi i brani di sanremo.
SQL non lo conosco, devi tradurlo tu. :)
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:ricerche condizionate (complesse) con SQL
« Risposta #11 il: 13 Febbraio 2017, 19:13:11 »
Potresti trovare la maniera di mettere le varie condizioni in parentesi nidificate.
Ad es. ((italiani AND rock) NOT 80) NOT sanremo. In questo caso prima verrebbero selezionati i brani rock italiani, poi verrebbero esclusi i brani anni '80, poi verrebbero esclusi i brani di sanremo.
SQL non lo conosco, devi tradurlo tu. :)

la forma corretta infatti sarebbe questa (coprirebbe le giuste "precedenze"), ma e' un ulteriore livello di analisi :D
se corri, morirai stanco (motto degli sniper)