Newsgroup: it.comp.lang.delphi
Titolo: Trovare il record giusto....

Buongiorno gente.
Essendo io duro pinato con i DB, chiedo a voi lumi...
Ho una sfilza di circa 19.000 record (non è fondamnentale sapere dove li 
ho al momento, possono stare su un db o qualsiasi altro "tipo"...non è 
questo il punto....) su una "tabella" di 2 righe (un "db" con 2 colonne 
e 19.000 righe).
Qualcosa tipo questo:
 
 
J2	DJIBOUTI
J20/A	ABU AIL IS.
J20/Z	ABU AIL IS.
J3	GRENADA
J4	GREECE
J42004Q	CRETE
J42004ZFG	CRETE
J45	DODECANESE
J48	GREECE
J49	CRETE
J5	GUINEA-BISSAU
J6	ST. LUCIA
J7	DOMINICA
J8	ST. VINCENT & THE GRENADINES
J9	OKINAWA (RYUKYU IS.)
JA	JAPAN
JA1JG/A	ANTARCTICA
JA1JWP/JD1	OGASAWARA
JA1KJW/JD1	OGASAWARA
JA1KJW/JD1	OGASAWARA
JA1RJU/JD1	OGASAWARA
JA1SGU/JD1	OGASAWARA
 
 
 
Data una stringa del tipo "J6UIPF", come faccio a tirar fuori ST.LUCIA ?
Spero di essermi spiegato...è una sorta di "best match"...come se 
dovessi "pesare" i caratteri da sinistra verso destra (purtroppo molto 
raramente le 2 stringhe da comparare sono della stessa lunghezza....).
 
Sarà che è mattina presto...ma non trovo proprio un modo, quasiasi 
suggerimento è ben accetto!.
 
Grazie infinite e buona giornata.
 

IK5              ITALY	
IK5DHM/ANT       ANTARCTICA	
IK6              ITALY	
 
Qui forse si capisce meglio....se io ho IK5JPF, la "select" deve 
restituirmi il primo record...(dico select giusto per cercare di esser 
più chiaro).
Ripeto, la "locazione" dei dati "db,lista di stringhe,etc...) non l'ho 
ancora decisa (resta il fatto che ho solo 2 colonne...)

 ancora decisa (resta il fatto che ho solo 2 colonne...)
 
Ti serve una LIKE, con una clausola che limiti l'estrazione al primo record trovato.
 
Per esempio, in MySQL:
 
SELECT *
FROM tua_tabella
WHERE id LIKE 'IK5%'
LIMIT 1;
 
In Oracle:
SELECT *
FROM tua_tabella
WHERE id LIKE 'IK5%'
  AND ROWNUM <= 1
 


Grazie tante, mi documento subito e provo!
 

 Grazie tante, mi documento subito e provo!
 
Bada che la clausola SQL per limitare il numero di record distribuiti non e` necessariamente presente nel dialetto SQL particolare del db che stai usando. In tal caso, quando apri il cursore sulla LIKE, semplicemente estrai il primo record.
 

 Data una stringa del tipo "J6UIPF", come faccio a tirar fuori ST.LUCIA ?
 
caaaaaaazzzzzooooo! vi danno proprio robba buona....ma ve la danno fin 
dalle elementari?
 
-- 
Imparare è un'esperienza, tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
La mente intuitiva è un dono sacro e la mente razionale è un fedele 
servo. Noi abbiamo creato una società che onora il servo e ha 
dimenticato il dono.
(Albert Einstein)


 
Plonk!
 


 
ed hai risolto il problema...vero?


 semplicemente estrai il primo record.
 
E' questo che non ho capito.
Lui vuole, comunque, solo il primo record a prescindere di cosa metti nella 
query.
Se utilizza il like con 'IK5*' si deve aspettare una quantita' di record 
tale quanto ne soddisfa il criterio di ricerca.
In questo caso, dalla lista dei record avra' la scelta e potra' selezionare 
quello deisderato.
 
Che senso ha prendere il primo record di una lista di n record ?
 
Probabilmente (io) non ho capito il suo problema.
 
Ciao
 
Daniele 
 

 Data una stringa del tipo "J6UIPF", come faccio a tirar fuori ST.LUCIA ?
 
A me serve qualche informazione in piu':
 
1) da dove arrivano le stringhe della colonna di sinistra?
2) da dove arrivano le stringhe tipo "J6UIPF"
3) con che frequenza le associazioni cambiano?
4) c'è la possibilità che "J6UIPF" oggi punti a ST.LUCIA e domani a Elle McPherson e tra un mese a "SASSICAIA 2009"?
 
 
A.


 
Non puoi risolvere con queste limitationi: devi fare un post process sui 
dati ritornati dalla like; io userei la distanza di Levenshtein per 
calcolare quale stringa sia la più vicina a quella usata nella like.
 
https://it.wikipedia.org/wiki/Distanza_di_Levenshtein
 
 
Riassumendo: la query ritorna decine di righe, con l'algoritmo prendi la 
più simile a quella cercata.
 
-- 
Morde

 Plonk!
 
Ignoralo. E` un troll idiota.
 

 Che senso ha prendere il primo record di una lista di n record ?
 
Lui in realta` vuol fare un "best match". Temo che neanche la LIKE lo aiuti. Deve rassegnarsi a leggere i dati in blocco e scorrerli applicando un algoritmo di selezione.

 4) c'è la possibilità che "J6UIPF" oggi punti a ST.LUCIA e domani a Elle McPherson e tra un mese a "SASSICAIA 2009"?
 
Ma cosa c'entra??

 McPherson e tra un mese a "SASSICAIA 2009"?
 
 
             ^^^^^^^^^^^^
Bhe, questo potrebbe interessare anche a me ... magari non fra un mese !!! 
:-)))
 
OK, scusa
 
Ciao
 
Daniele 
 

 4) c'è la possibilità che "J6UIPF" oggi punti a ST.LUCIA e domani a Elle McPherson e tra un mese a "SASSICAIA 2009"?
 
no
 
 
Grazie per la cortese attenzione


Mò vado a leggere....thanks!
 


ecco, bravo , vuoi dire a questi 4 coglioni che non sono un troll per 
favore?
ma dove sei sgtato fino ad ora? a farte pippe?


 no
Bene
 
Nella lista da te proposta (sopra) le referenze "doppie" sono poche e se ci 
sono qualche significato lo devono pure avere
JA1KJW/JD1 OGASAWARA
JA1KJW/JD1 OGASAWARA
 
Una caricato il tuo db e avendo messo a disposizione una bella griglia, puoi 
sempre mettere sotto/sopra una griglia un edit che ha la funzione di lookup.
Ogni volta che premi un tasto filtri la griglia (in real time) per quel 
testo, alla fine se digiti
 
JA1KJW/JD1
 
avrai le due corrispondenze (perche' se ne hai due.... a quale delle due si 
devono fare le modifiche?).
Scelta una delle 2 sulla dbgrid (quindi la riga della griglia) tutto quello 
che andrai a fare sul quel record sara' registrato sul record puntato 
(quindi a vista).
 
Probabilmente il problema che hai e' piu' complesso e, molto probabilmente, 
continuo a non capire.
 
Ciao
 
Daniele 
 


 
Ci conosciamo da anni e posso dire che sei una persona speciale, con 
tutti gli attributi, che non hai mai mollato e che ci sai fare nel tuo 
lavoro.
Tuttavia il tuo palese trollaggio non può essere difeso.. mi spiace :-)
Cmq spero tu stia bene.
Ciao
 
-- 
Morde

 Bhe, questo potrebbe interessare anche a me ... magari non fra un mese !!! 
 
Parli della modella o del vino?? :-P
 
A.

 continuo a non capire.
 
Quel che consigli tu e` del tutto inefficiente. Lui deve selezionare un subset dei dati, secondo un certo criterio, e ciclare sui risultati applicando un algoritmo di selezione - che sia la distanza di Levenshtein (come gia` suggerito) o altro non ha importanza.
 
 

Al solito, mi spiego peggio di un politico della 99a repubblica...
Ok..hai un excel o altro
E i dati che stanno dentro ti arrivano per pacco celere, via seduta spiritica  o che altro? 
 
Come altri ti hanno suggerito, l'unica è fare una select con un like utilizzando i primi n caratteri della stringa inserita dall'utente.
Nel tuo caso, quindi, data la chiave "J6UIPF":
 
select * from tabella where codice like 'J6' order by codice.
 
Con i risultati della select ti popoli una qualcke lista in memoria sulla quale iteri per cercare la chiave utilizzando la distanza di Levenshtein o altro.
 
Se poi la ricerca restituisce più di una riga, l'unica è proporre all'utente una lista dalla quale sceglie quello che gli pare.
 
A.

 Come altri ti hanno suggerito, l'unica è fare una select con un like utilizzando i primi n caratteri della stringa inserita dall'utente.
 
Il suo problema e` capire proprio quel n. Non puo` ricorrere ad una like. Deve estrarre tutti i dati e applicare l'algoritmo di best match.

 Parli della modella o del vino?? :-P
 
..... non puoi aprire un vino cosi' da solo !!!
Considerata la modella inarrivabile .... va bene anche la vicina prosperosa 
di pochi costumi (anzi .. senza costumi..)
 
Si sta esagerando ??
 
Ciao
 
Daniele 
 

 ha importanza.
 
Ricapitolando:
Lui ha una serie di record (sembra) strutturati in stringhe come da lista
 
JA1JG/A ANTARCTICA
JA1JWP/JD1 OGASAWARA
JA1KJW/JD1 OGASAWARA
JA1KJW/JD1 OGASAWARA
JA1RJU/JD1 OGASAWARA
JA1SGU/JD1 OGASAWARA
 
All'utente e' richiesto solo l'inserimento dei una stringa che 
(probabilmente) sara' cercata nella prima parte
 
JA1JG/A
JA1JWP/JD1
JA1KJW/JD1 *
JA1KJW/JD1 *
JA1RJU/JD1
JA1SGU/JD1
 
Mi dici come fai con Levenshtein a capire quale dei 2 con "*" deve prendere 
??? dato che sono perfettamente uguali ?
 
Sempre per didattica (ovviamente per me) una volta premuto enter si carica 
le matrici per i 19000 record e poi li compra ?
Infine, una volta calcolate tutte le distanze, quale prende ?? Quella con il 
numero piu' piccolo ??
 
Sempre abusando della tua (vostra) pazienza, qualche link sull'uso di questo 
algoritmo ??
Io nelle ricerche sui db ho sempre usato la like o, nel caso di una stringa 
specifica, as.
Anche in termini di velocita' non ho mai avuto grandi problematiche (fino a 
3.5 milioni di records).
 
Grazie per la tua attenzione
 
Ciao
 
Daniele 
 

 specifica, as.
 
La LIKE non e` di nessun aiuto se cerchi un best match.
 


Scusa la mia niubbaggine...magari dico una castroneria...ma mi è venuta 
in mente una prova da fare...posso fare diverse "select/like"... per 
quanti sono i caratteri della stringa utente...quando non ritorna più 
niente, prendo il risultato precedente...
Nel senso che faccio le ricerche su queste stringhe (in quetso esempio)
 
J
J6
J6U
J6UI
J6UIP
J6UIPF
 
E' una cattiva idea? è da pèrovare o è tempo perduto?
 

 E' una cattiva idea?
 
Si`. 
Ti conviene caricare i dati in memoria e processarli applicando un algoritmo di "best match", come gia` consigliato.
 


Ok...quindi una prima "select" per dare una scremata e poi vado di best 
match?
 
Una prima scremata devo darla sicuramente...i record iniziali potrebbero 
in un lontano futuro (che prego arrivipresto in realtà) arrivare ad 1 
milione...
Farei una select solo sul primo carattere e poi ci darei dentro come mi 
avete già suggerito..
Così può andare?
 
Grazie dei consigli
 

 Così può andare?
 
Quale sia la scrematura da adottare dipende strettamente da quello che vuoi fare. Se va bene o meno, devi dirlo tu.

> E' una cattiva idea? è da pèrovare o è tempo perduto?
 
Il costo di n select è maggiore di quello di una sola select con successiva elaborazione in memoria.
 
A.
 

 Si sta esagerando ??
 
Naaaahh....
 
A.


Thanks
 


sto bene, grazie...comunque 4ndre4 è insopportabile...altro che troll


> sto bene, grazie...
 
Ricorda che siamo sempre in "wait" per quel buon bicchiere di rosso. :-P
 
A.


non dimentico!


 non dimentico!
 
Se non siete troppo lontani da Como possiamo organizzare un pomeriggio 
(magari sul lago) cosi' da sapere chi siamo, poi come aperitivo un bel 
bicchiere di rosso o altro.
Fattibile ?
 
Ciao
 
Daniele 
 


certo


On Saturday, 25 June 2016 01:28:17 UTC+1, Alberto Salvati  wrote:
 
[...]
Don't feed the troll.

 Fattibile ?
 
Si potrebbe fare.
 
A.