Newsgroup: it.comp.appl.access
Titolo: query di ricerca con piu' criteri (sono disperata...)

Ciao a tutti,
lo so il post è un po' lungo (l'avevo inviato col server di ciaoweb, ma non
lo vedevo), ma abbiate pazienza, il problema per me è
complicato da spiegare e ormai sono disperata :-(
Io devo creare un db che archivi degli articoli e che poi permetta di
trovarli inserendo delle parole chiave. Io ho disegnato questa a struttuta:
Tabella articoli
----------------
IdArticolo
titoloArticolo
autore
rivista
anno...
Tabella parole chiave
----------------------
IdArticolo
ParolaChiave
le due tabelle sono legate da una relazione "uno a molti" su IdArticolo. In
fase di inserimento tutto ok, ma in fase di ricerca non so piu' cosa pensare
per ottenere il risultato che mi sono prefissata. Dunque i criteri di
ricerca sono; autore, rivista e 6 parole chiave. Il problema è che non
riesco a costruire una query che estragga in modo selettivo sulle parole
chiave. Come faccio a costruire una query di join fra le 2 tabelle che
estragga solo gli articoli che contengono TUTTE le parole-chiave? Faccio un
esempio se immetto come criteri:
autore =                 Pippo
rivista =                  *
parola-chiave1 =    windows
parola-chiave2 =    access
parola-chiave3 =    form
io voglio che mi estragga tutti gli articoli che hanno come autore "Pippo" e
come parola-chiave sia "windows" che "access" che "form". Ho fatto una serie
di tentativi, ma sono solo riuscita a mettere le parole-chiave in OR fra
loro e non in AND. Probabilmente quello che voglio fare non si puo' ottenere
con un'unica query, ma allora come faccio? Se sara' necessario vi posterò le
"mostruose" query che ho scritto, ma datemi una dritta perche' ormai sto
impazzendo.
Grazie.
Ilaria

...

Invece di inserire n record con n parole chiave nella tabella chiavi,
inserisci un unico record che contiene le parole chiave inserite separate
magari da un ; (a questo punto potresti anche utilizzare un unica tabella
con un campo in più quello delle parole chiave).
Quando farai la query scriverai come criterio
Like *chiave1* AND *chiave2* ecc.
Antonio

 estragga solo gli articoli che contengono TUTTE le parole-chiave
Ciao,
sei la stessa cui avevo risposto tempo addietro proprio su questo db?
Comunque se non posti il codice SQL che usi non possiamo vedere cosa c'e'
che non va.
Postalo che gli diamo un'occhiata.
Ciao, Sib

 Postalo che gli diamo un'occhiata.
Te la sei voluta: questa č la mostruosa query origine della sottomaschera
nella maschera di ricerca fRicercaArticoli
SELECT articoli.idArticolo, articoli.titArt, articoli.titRivista,
articoli.autore, articoli.volume, articoli.numero, articoli.pagg,
articoli.anno, articoli.collocazione
FROM articoli INNER JOIN keywords ON articoli.idArticolo =
keywords.idArticolo
WHERE (((articoli.titArt) Like [Maschere]![fRicercaArticoli]![cArticolo])
AND ((articoli.autore) Like [Maschere]![fRicercaArticoli]![cAutore]) AND
((keywords.keyword) Like [Maschere]![fRicercaArticoli]![cKeyword1])  And
((keywords.keyword) LIKE [Maschere]![fRicercaArticoli]![cKeyword2]))
GROUP BY articoli.idArticolo, articoli.titArt, articoli.titRivista,
articoli.autore, articoli.volume, articoli.numero, articoli.pagg,
articoli.anno, articoli.collocazione;
Spero tu riesca a capire qualcosa...
Bye
Ilaria

 Ilaria
Ilaria, cosi' com'e', non puo' funzionare.
Il motivo e semplice, hai fatto una queri che crea, per ogni articolo, un
record per ogni parola chiave, es:
Tab Articoli
IDArt    Altro
1            blabla
2            blabla
TabKeys
IDArt        Key
1                a
1                b
2                a
2                c
Il risultato non filtrato della tua query e':
IDArt    Altro    Key
1            blabla    a
1            blabla    b
2            blabla    a
2            blabla    c
E chiaro che se filtri il campo key per piu' di una parola chiave (key=1 and
key=2) non esce niente perche' non c'e' nessun record che soddisfa
contemporaneamente queste condizioni.
La soluzione piu' semplice e' senz'altro quella indicata da Biso (vedi post)
Ciao, Sib

 Ciao, Sib
Ciao RoDAgo
Ps. Ci sono novità, poi te faccio sapè!

come parola-chiave sia "windows" che "access" che "form". Ho fatto una serie
per quanto "normale" la struttura dei dati non mi sembra l'ideale per
la ricerca.  come suggerisce Biso, credo sia meglio prevedere un unico
campo nel quale immettere tutte le parole chiave separate da un punto
e virgola o qualcosa di simile e poi usare la funzione instr (anche
all'interno di una query) per verificarne la presenza.
comunque potresti provare cosi'.  crea una query, carica la tabella
articoli e quella delle parole chiave, joinale per idarticolo se
questo non avviene automaticamente.  carica nella query tutti i campi
della tabella articolo e due volte il campo parolachiave dalla tabella
delle parole chiave.
clicca il pulsante delle query di raggruppamento, scegli
raggruppamento per tutti i campi della tabella articoli, scegli
conteggio per il "primo" campo parolachiave e "dove" per il secondo.
nota che il segno di spunta sotto quel campo, che indica se il campo
viene visualizzato nella query, viene tolto.  va bene cosi'.
imposta adeguatamente i criteri di ricerca per i campi della tabella
articoli e scrivi qualcosa tipo windows OR access OR form sotto il
campo parola chiave "dove".
sotto il campo parola chiave conteggio ci scrivi 3, ovvero il numero
delle parole chiave cercate.
la query dovrebbe funzionare cosi'.  ammettiamo che ci sia solo un
record nella tabella articoli che soddisfi i criteri di ricerca
impostati.  questo record pero' avra' tre corrispondenti record nella
tabella parole chiave.  se joiniamo le due tabelle in una query
otteniamo il cosiddetto prodotto cartesiano dei record, cioe' il
record della tabella articoli ripetuto tre volte con a fianco i tre
valori del campo parola chiave.  se avesse avuto due parole chiave
sarebbe stato ripetuto due volte, se ne avesse avute cinque, cinque.
raggruppiamo per i campi di tabella articoli.  questo vuol dire
prendere una volta sola quei record la cui n-upla (o combinazione) dei
campi sia uguale.  se raggruppassimo anche per il campo parola chiave
l'n-upla (la combinazione) non sarebbe piu' uguale, ce ne sarebbero 3
diverse.  ma noi il campo parola chiave lo conteggiamo, non lo
raggruppiamo.  gli abbiamo anche messo un filtro per il quale lui puo'
valere windows oppure access oppure form, quindi ci interessa prendere
quel record nel quale si conteggino almeno tre parole chiave.
a parole e' un po' complicato.  se ti costruisci la query e ne guardi
i risultati in foglio dati capisci subito.
--
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/

Una soluzione alternativa potrebbe essere quella di usare n volte la clausola
EXISTS per verificare che ci sia la parola chiave nel DB... la tua soluzione
come definizione dati è sicuramente più elegante e "pulita" di quella di
Antonio, anche se la sua è effettivamente quella più pratica da usare, anche se
è più prona a rischi (sto pensando a un aggiornamento sbagliato della lista
delle parole, che può diventare complicata da pulire...).
In pratica:
SELECT ...
FROM  ...
WHERE (((articoli.titArt) Like [Maschere]![fRicercaArticoli]![cArticolo])
      AND ((articoli.autore) Like [Maschere]![fRicercaArticoli]![cAutore]))
      AND EXISTS (SELECT keyword
                  FROM keywords
                  WHERE articoli.idArticolo = keywords.idArticolo
                        AND keyword Like [Maschere]![fRicercaArticoli]![cKeyword1])
      AND EXISTS (SELECT keyword
                  FROM keywords
                  WHERE articoli.idArticolo = keywords.idArticolo
                        AND keyword Like [Maschere]![fRicercaArticoli]![cKeyword2])
etc...
Ok, non è affatto veloce, ma dovrebbe funzionare...
Ciao,
    Matteo

 key=2) non esce niente perche' non c'e' nessun record che soddisfa
Volevo dire  Key="a" and Key="b"!!


 Ciao RoDAgo
Hazzzz...
Che figuraccia!!!!
Maledetta tastiera traditrice!!!
Sib
PS (attendo notizie)

 serie


virgola?
prima controlli che il valore che vuoi inserire non sia gia' presente.
questo lo fai con la funzione instr.  dopo scrivi una cosa del genere:
categoria=categoria & ";" & nuovovalore


Ragazzi, grazie a tutti per i suggerimenti, io purtroppo mi sono dovuta
assentare per 2 giorni e non ho potuto rispondervi prima :-( (sembra proprio
che non riesca ad arrivare in fondo a questo benedetto problema, prima mi si
impalla il server delle news, poi non riesco a seguire il ng per 3
giorni...), comunque adesso proverò le soluzioni suggerite da Antonio, da
Matteo, da Sib e da Lbo e poi vi saprò dire.
Grazie ancora.
Ilaria

...

A me m'ha messo per primo, tiè!
Antonio

 wrote in message
38db6764...@news.interbusiness.it...



Ma è perché tu sei uno dei pilastri di questo ng (adesso gli altri si
offenderanno...) e non si può non tenerne conto ;-)
Bye
Ilaria

...

Che gli altri si offendano!
Ci siamo io e te, e possiamo lasciare il mondo gretto e ostile fuori dalle
nostre vite...
E il futuro ci sorriderà...
(Da leggere con la colonna sonora di via col vento N.d.R.)
Antonio

offenderanno...) e non si può non tenerne conto ;-)
e diglielo che sei andata in ordine alfabetico...
zlbo.


> categoria=categoria & ";" & nuovovalore
--





casella di testo, ma sempre nella casella combinata.
cioe' in un'altra casella combinata?  non e' meglio metterli in una
listbox?  poi come li usi?


Aspetta, forse - data la mia ignoranza - non mi sono spiegato.
Nella tabella principale c'e' un campo Categoria1. Nella form principale
c'e' una casella combinata che legge i valori da un'altra tabella
(tabCategorie) e li visualizza in ordine alfabetico. La selezione del valore
dovrebbe permetterne la memorizzazione nel campo Categoria1. Qui, io vorrei
poter memorizzare piů di un valore.
Grazie ancora dei suggerimenti
Francesco Giacanelli
md1...@mclink.it


poter memorizzare piů di un valore.
ok, allora tutto chiaro.  tu clicchi piu' volte sulla combo e man mano
i valori che scegli vengono accodati in un controllo del tipo casella
di testo.  quest'ultimo e' legato al campo categoria1 della tabella.
attenzione a non confondere campi delle tabelle con i controlli delle
maschere che ne visualizzano i valori.
