Access: ricerca tramite in 2 campi query

domenica 10 febbraio 2008 - 23.50

miomiomio Profilo | Junior Member

ciao a tutti,
vorrei chiedervi se esiste la possibilità di ricercare una frase o parola controllando 2 campi di una tabella.

per ora ho usato
Like "*"+[Ricerca per titolo]+"*"
per ricercare una o più parole in un campo.
appena lancio la query access mi fa comparire una finestra dove inserire il testo da ricercare e lo ricerca correttamente in un campo.
è possibile fare la stessa cosa ,a che controlli in 2 campi lo stesso testo?
grazie

alx_81 Profilo | Guru

>ciao a tutti,
Ciao!

>vorrei chiedervi se esiste la possibilità di ricercare una frase
>o parola controllando 2 campi di una tabella.
>per ora ho usato
>Like "*"+[Ricerca per titolo]+"*"
>per ricercare una o più parole in un campo.
>appena lancio la query access mi fa comparire una finestra dove
>inserire il testo da ricercare e lo ricerca correttamente in
>un campo.
>è possibile fare la stessa cosa ,a che controlli in 2 campi lo
>stesso testo?

SELECT Campo1 , Campo2 FROM Tabella WHERE Campo1 Like '*' + [Ricerca per titolo] + '*' AND Campo2 Like '*' + [Ricerca per titolo] + '*'

Utilizzando la stessa descrizione nel prompt dovrebbe chiedertelo solo una volta.

>grazie
di nulla!
Più che altro spero di aver capito il problema
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

credo che tu l'abbia capito in pieno!
ti ringrazio per la risposta immediata!!

ho provato a mettere il codice ma mi dice: caratteri non previsti dopo la fine dell'istruzione SQL
il codice della query è questa:
SELECT titoli.keywords, titoli.capitoli, titoli.titolo, titoli.autore, titoli.editore, titoli.fondo, titoli.copie
FROM titoli;
WHERE keywords Like "*" + [Ricerca per titolo] + "*"
AND capitoli Like "*" + [Ricerca per titolo] + "*"

ho provato anche con gli apici ' come mi avevi postato te ma mi dice uguale
ho provato anche con le parentesi ma nulla
SELECT titoli.keywords, titoli.capitoli, titoli.titolo, titoli.autore, titoli.editore, titoli.fondo, titoli.copie
FROM titoli;
WHERE (keywords Like "*" + [Ricerca per titolo] + "*" )
AND (capitoli Like "*" + [Ricerca per titolo] + "*")
dove sbaglio?

alx_81 Profilo | Guru

>credo che tu l'abbia capito in pieno!
>ti ringrazio per la risposta immediata!!
stavo volando a letto
>
>ho provato a mettere il codice ma mi dice: caratteri non previsti
>dopo la fine dell'istruzione SQL
Togli il terminatore dopo il nome della tabella. Il ; è di troppo. Mettilo alla fine dell'istruzione se necessario oppure omettilo.

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

allora cosi non dà errori:

SELECT titoli.keywords, titoli.capitoli, titoli.titolo, titoli.autore, titoli.editore, titoli.fondo, titoli.copie
FROM titoli
WHERE (((titoli.keywords) Like "*"+[Ricerca per titolo]+"*") AND (("titoli.capitoli") Like "*"+[Ricerca per titolo]+"*"));

solo che mi restituisce solo i record trovati della colonna keywords non cerca nei capitoli.

se invece di and metto or mi da sempre e comunque tutti i record.
non ti voglio farti stare sveglio quindi aspetterò una per tua risposta domani o quando potrai!
grazie ancora

alx_81 Profilo | Guru

>AND (("titoli.capitoli") Like "*"+[Ricerca per titolo]+"*"));
>
>solo che mi restituisce solo i record trovati della colonna keywords
>non cerca nei capitoli.
Ora rimuovi le " attorno alla titoli.capitoli
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

iperperfetto!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
funziona alla grande!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
grazie davvero e scusami se ti ho fatto fare tardi!

alx_81 Profilo | Guru

>iperperfetto!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>funziona alla grande!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>grazie davvero e scusami se ti ho fatto fare tardi!
ma figurati, se non fossi stato sveglio non avrei risposto no? Ti è andata bene che ero per caso ancora online

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

ho comunque messo OR come operatore perchè preferisco mi trovo uno o l'altro anche se la parola non compare in tutti e due i campi.

grazie davvero!

miomiomio Profilo | Junior Member

un'altra cosuccia...
se ho bisogno di fare una ricerca su 2 campi di 2 tabelle?
ho provato cosi
SELECT keywords.parolechiave, capitoli.capitoli, titoli.titolo, titoli.autore, titoli.editore, titoli.fondo, titoli.copie
FROM (titoli INNER JOIN capitoli ON titoli.ID = capitoli.idtitoli) INNER JOIN keywords ON titoli.ID = keywords.idtitoli
WHERE (((keywords.parolechiave) Like "*"+[Ricerca per titolo]+"*")) OR (((capitoli.capitoli) Like "*"+[Ricerca per titolo]+"*"));

ma mi fa un gioco strano
sembra che mi metta tutti i record dilla tabella capitoli e non ricerchi nella tabella keywords
sapresti mica perchè?
so che si va sull'incasinato non vedendo il database ma vista la tua bravura io ci provo!!

grazie ancora

alx_81 Profilo | Guru

>se ho bisogno di fare una ricerca su 2 campi di 2 tabelle?
>ho provato cosi
>SELECT keywords.parolechiave, capitoli.capitoli, titoli.titolo,
>titoli.autore, titoli.editore, titoli.fondo, titoli.copie
>FROM (titoli INNER JOIN capitoli ON titoli.ID = capitoli.idtitoli)
>INNER JOIN keywords ON titoli.ID = keywords.idtitoli
>WHERE (((keywords.parolechiave) Like "*"+[Ricerca per titolo]+"*"))
>OR (((capitoli.capitoli) Like "*"+[Ricerca per titolo]+"*"));
>
>ma mi fa un gioco strano
che gioco strano?

>so che si va sull'incasinato non vedendo il database ma vista
>la tua bravura io ci provo!!
è una semplice join.. più che altro fai attenzione ad abusare delle Like con i caratteri speciali a destra e a sinistra.. rallenta di molto le esecuzioni delle query..
>
>grazie ancora
di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

allora ho ricontrollato praticamente qualsiasi valore immetta come ricerca non mi mostra nessun record.
niente che sia presente o meno nei campi.

ho provato anche a mettere 2 valori uguali in un record per tutti e 2 i campi in cui ricerca e a mettere l'operatore and.
nulla...
qualche idea?

alx_81 Profilo | Guru

>allora ho ricontrollato praticamente qualsiasi valore immetta
>come ricerca non mi mostra nessun record.
>niente che sia presente o meno nei campi.
>qualche idea?
lancia la query senza la where condition.. Ho paura che sia errata la join.

Poniti le seguenti domande:

1) Tutte e due le tabelle hanno record?
2) La relazione si verifica?

Se i campi che usi per la join non hanno valori uguali sia in una tabella che nell'altra, non otterai alcuna riga.

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

>Se i campi che usi per la join non hanno valori uguali sia in una tabella che nell'altra, non
>otterai alcuna riga.


ma io avrei proprio questa necessità

se ricerco 'casa' vorrei che mi mostrasse i record in cui la parola casa compare O nel campo parolechiave O nel campo capitoli

alx_81 Profilo | Guru

>se ricerco 'casa' vorrei che mi mostrasse i record in cui la
>parola casa compare O nel campo parolechiave O nel campo capitoli
Sì, ma se metti in relazione le due tabelle in quel modo e se i valori non combaciano col criterio di join, non vedrai mai record.
Quindi la where fatta su una relazione che non si verifica è inutile.

Hai la possibilità di definire un criterio di OUTER JOIN per ottenere comunque tutti i record di una tabella o di entrambe ma poi potresti avere una delle due tabelle in cui il match non si verifica.

Però prima di arrivare a conclusioni avventate, perchè non mi posti i comandi di CREATE TABLE, qualche insert e quello che vuoi vedere in uscita come resultset?

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

lo sapevo io!! non avevo capito una mazza del join :-(
allora il database è così strutturato
_________________________________________
tabella <titoli>
<id>[contatore] <titolo>[memo] <autore>[testo]
_________________________________________



_________________________________________
tabella <keywords>
<id>[contatore] <idtitolo>[numerico] <parolechiave>[memo]
_________________________________________


_________________________________________
tabella <capitoli>
<id>[contatore] <idtitolo>[numerico] <capitolo>[memo]
_________________________________________



ho un libro nella tabella <titoli> ci sarà:
1 | I promessi Sposi | Manzoni
2 | Il male di luna | Pirandello

nella tabella <keywords> ci sarà:
1 | 1 | renzo lucia agnese rodrigo abbondio bravi lazzaretto
2 | 2 | patente mosca ciaula


nella tabella <capitoli>
1 | 1 | notte dei brogli e dei sotterfugi
2 | 1 | l'innominato
3 | 2 | Ciaula scopre la luna



e via discorrendo.

ora se io ricerco "innominato" vorrei che la query guardasse dentro ai record della tabella keywords e a capitoli
e mi tirasse fuori:
i promessi sposi | manzoni


lo stesso se cerco sotterfugi.

no so se sono stato chiaro e mi scuso per il mio linguaggio terra terra!
grazie 1000 per il tempo che mi dedichi

alx_81 Profilo | Guru

>lo sapevo io!! non avevo capito una mazza del join :-(
>allora il database è così strutturato
>ora se io ricerco "innominato" vorrei che la query guardasse
>dentro ai record della tabella keywords e a capitoli
>e mi tirasse fuori:
>i promessi sposi | manzoni
>
>lo stesso se cerco sotterfugi.

con questa dovresti ottenere quello che ti serve:

SELECT t.titolo , t.autore FROM titoli t INNER JOIN keywords k ON k.idtitolo = t.id INNER JOIN capitoli c ON c.idtitolo = t.id WHERE c.capitolo LIKE "*" + [Ricerca] + "*" OR k.parolechiave LIKE "*" + [Ricerca] + "*" GROUP BY t.titolo , t.autore

>
>no so se sono stato chiaro e mi scuso per il mio linguaggio terra
>terra!
diciamo che ti avevo chiesto le create e le insert.. ma stavolta sorvolo . Fai attenzione alla normalizzazione, che qui non sarebbe male.. il campo parolechiave viola già la prima forma. Personalmente non avrei strutturato il database in quel modo..

>grazie 1000 per il tempo che mi dedichi
di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

io di access come ti sarai accorto non so praticamente nulla e neanche di normalizzazione, CREATE TABLE :-(

come sarebbe da strutturare? sono ancora in tempo, sono solo all'inizio!
thanks

miomiomio Profilo | Junior Member

ho messo così ma mi dà errore

ovviamente t c k sono abbreviazioni vero?
SELECT
titoli.*, titoli.*, keywords.*, capitoli.*, keywords.*
FROM
titoli INNER JOIN keywords keywords ON keywords.idtitolo = titoli.id
INNER JOIN capitoli capitoli ON capitoli.idtitolo = titoli.id
WHERE
capitoli.capitolo LIKE "*" + [Ricerca] + "*"
OR keywords.parolechiave LIKE "*" + [Ricerca] + "*"
GROUP BY
titoli.titolo, titoli.autore;

alx_81 Profilo | Guru

>ho messo così ma mi dà errore
normale. cerchi di selezionare tutti i campi e di raggruppare per due solamente.
La select list deve essere la stessa della group by a meno che nella select non specifichi per alcuni campi, una funzione di aggregazione.
>
>ovviamente t c k sono abbreviazioni vero?
sono alias, puoi assegnare l'alias ad ogni tabella per comodità.

>come sarebbe da strutturare? sono ancora in tempo, sono solo all'inizio!
da modellare meglio, sfruttando le regole di normalizzazione. Con il tuo metodo, se il db cresce davvero perderai in scalabilità e le interrogazioni rallenteranno sempre di più.

magari questa sera provo a postarti come lo farei.. a livello di modellazione..
ma tu dai una letta a questo link:

http://it.wikipedia.org/wiki/Normalizzazione_del_database



Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

perfetto! devo quindi imparare il processo di normalizzazionne. sembra complesso ma ci riuscirò!
migliorare sempre anche se nel mio caso c'è proprio - solo - da migliorare visto che non so nulla di access e progettazione!
grazie

alx_81 Profilo | Guru

Eccoci..

Allora, vediamo come modellerei il db per renderlo più "normale" (da normalizzazione )

prima tabella tua:

tabella <titoli>
<id>[contatore] <titolo>[memo] <autore>[testo]

Siccome l'autore la vedo come un'entità a se stante in relazione col titolo, farei una tabella autori ed una titoli. Poi farei attenzione al fatto che lo stesso titolo potrebbero averlo dato più autori, quindi aggiungerei una tabella di legame:

Titoli
IDTitolo
Titolo

Autori
IDAutore
Autore

Titoli_Autori
IDTitolo
IDAutore

La relazione è 1:N tra titoli e Titoli_Autori e 1:N tra Autori e Titoli_Autori
Mi comporterei allo stesso modo per la capitoli.

Capitoli
IDCapitolo
Capitolo

Titoli_Capitoli
IDCapitolo
IDTitolo

Relazione 1:N tra Capitoli e Titoli_Capitoli e relazione 1:N tra Titoli e Titoli_Capitoli

Mentre per la keywords, starei attento al campo parolechiave. Cerca di evitare campi che non hanno valori atomici al loro interno.

tabella <keywords> tua:
<id>[contatore] <idtitolo>[numerico] <parolechiave>[memo]

Io la farei così:

Titoli_Keywords
IDTitolo
IDKeyword

Keywords
IDKeyword
Keyword

Relazione 1:N tra Titoli e Titoli_Keywords e 1:N tra Keywords e Titoli_Keywords.
In questo modo, hai aumentato tabelle e relazioni (ricorda che il motore di un relazionale è fatto proprio per quello) ma hai una maggiore sicurezza di ottenere risultati veloci e risposte più affidabili. Prova a pensare alle keywords, se tu hai una keyword che va bene per più titoli, eviti di ridondarla in un campo memo come facevi prima. Le hai in verticale, e la ricerca, non è più per LIKE *parola* ma è per IN (il che ti permette di utilizzare eventuali indici per velocizzare le risposte). Considera che LIKE usato in quel modo è sempre sconsigliato. Poi, prova a pensare all'aggiornamento di una keyword. Se cel'avessi in più punti? Una semplice update sarebbe già una cosa complessa, così come la cancellazione di una o più keyword. In verticale invece, è una delete semplice e immediata.
Hai un po' di macchinosità, ma vai tranquillo che otterrai vantaggi..
Altra cosa, i tipi di dato. Scegli sempre il tipo di dato più piccolo per il valore più grande possibile di un campo. Memo, solo se è veramente necessario. Preferisci un testo e dagli una lunghezza massima non elevata. E' importante anche questo. E non omettere mai le relazioni su db. Ti servono anche come controllo di integrità..
Questa era solo un'infarinatura. E' come la penso ma sei libero di lasciare tutto come hai disegnato.

Spero possa esserti stato di aiuto.
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

cavolo se ci intendi!

mi sembra molto professional!
si allora lo provo a fare così.
ma una cosa:
per l'inserimento faccio una maschera; posso mettere campi che si vanno a memorizzare nelle tabelle giuste vero? cioè una maschera che va a scrivere in più tabelle.
sono ridondante (mi normalizzo??!) ma non posso che dirti grazie infiniteeeeeeeeee!!!!

alx_81 Profilo | Guru

>cavolo se ci intendi!

>
>per l'inserimento faccio una maschera; posso mettere campi che
>si vanno a memorizzare nelle tabelle giuste vero? cioè una maschera
>che va a scrivere in più tabelle.
Ti invito a postare un nuovo messaggio.. perchè rimango in fase di analisi.. con l'interfaccia di access non posso aiutarti molto.
Comunque credo proprio non ci siano problemi.

>sono ridondante (mi normalizzo??!) ma non posso che dirti grazie
>infiniteeeeeeeeee!!!!
ci sono casi in cui la normalizzazione non è necessaria ahahahahah

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

questa in allegato è la struttura delle relazioni.

ho iniziato bene?

e se devo inserire anche altre tabelle tipo collana, editore che possono essere gli stessi per più titoli allora faccio uguale a come mi hai detto te per le tabelle autore ecc?

miomiomio Profilo | Junior Member

ciao sono ancora io spero di non esasperarti

ma prima di proceder (anche se in realtà sono fermo alla creaziuone delle maschere) vorrei sapere se la struttura può andare cosi.
allego immagine relazioni.
grazie

alx_81 Profilo | Guru

>ciao sono ancora io spero di non esasperarti
scusami ma sono in un brutto momento. Abbi pazienza
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

certo.

spero che sia nulla di irrisolvibile e di troppo grave.
a presto

alx_81 Profilo | Guru

>spero che sia nulla di irrisolvibile e di troppo grave.
No, ero solo nel centro di una migrazione di sistema a lavoro , quindi GRAVE

Ho visto le tue relazioni, forse sono un po' estreme ..
Cerca di fare attenzione a capire quando ti serve una 1:N e quando una M:N..
tu hai fatto tutte M:N..

ti faccio un esempio:

ProvinciaDomicilio --> Utente --> 1:N --> Una sola provincia di domicilio per utente

Attori --> Film --> M:N --> Un attore può far parte di tanti film e un film può avere tanti attori

Sulla base di questo semplice concetto, devi capire se effettivamente sono tutte M:N quelle che ti servono.
Ma quello deve essere compreso da te in base alla qualità delle tue informazioni. Cerca di analizzare bene con semplici concetti se la tua relazione è corretta.
Ad esempio, un libro può avere solo un titolo, mentre un titolo può essere di più libri.. questa è una 1:N..
In base alla natura delle tue informazioni, stabilisci per bene le relazioni, anche per evitare di complicarti la vita
Ti saluto.. e per una settimana me ne vado in Portogallo.. se vuoi provare a scrivere non garantisco le risposte (a meno che non trovi un internet point laggiù)
Spero comunque di esserti stato di aiuto, ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

miomiomio Profilo | Junior Member

dire che mi sei stato d'aiuto è dir poco!
Mi hai aiutato a realizzare questo database ma soprattutto a capire la logica di progettazione e questo è veramente ma veramente positivo!!
ti ringrazio e buon viaggio, divertiti riposa eh...
ciao!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5