Problema di ricerca su più tabelle

Salve ragazzi, avrei necessità di implementare un semplice box di ricerca, in cui inserisco una parola chiave da ricercare sull'intero database, in particolare su queste tre tabelle

prodotto( CodProdotto, CodCategoria, Marca, Modello, Tipologia, Foto, DescrizioneSintesi, DescrizioneGenerale, SchedaTecnica, Composizione)

vende( CodFornitore, CodProdotto, CodCategoria, Prezzo, DispMagazzino)

categoria( CodCategoria, Descrizione)  Esempio:  1, Schede madri / 2, Hard Disk ecc.

La query invece è la seguente:

$query = " 
  SELECT P1.CodProdotto, C2.Descrizione, P1.Marca, P1.Modello, P1.Foto, P1.DescrizioneSintesi, V1.Prezzo
    FROM Categoria AS C2, Prodotto AS P1, Vende AS V1
   WHERE P1.CodProdotto=V1.CodProdotto 
        AND C2.CodCategoria=P1.CodCategoria
        AND ((P1.DescrizioneSintesi LIKE '%$val%') OR (C2.Descrizione LIKE '%$val%') OR (P1.Marca LIKE '%$val%') OR (P1.Modello LIKE '%$val%') OR (P1.Tipologia LIKE '%$val%')); ";

Ora finchè cerco parole singole tipo: "Asus" o "Monitor" la query va bene, ma se provo a fare una ricerca per "Monitor Asus" o "Asus Monitor" la query non restituisce nessun risultato.

La mia domanda è questa: come faccio a fare una ricerca anche per parole composte del tipo "Hitachi Hd-Eide" su tabelle in cui (come in questo esempio) la marca ed il formato si trovano su due colonne distinte ?  :-\

Grazie !

 

inviato 8 anni fa
whitewolf11
X 0 X

il modo più corretto sarebbe quello di utilizzare 2 caselle di testo in cui l'utente inserisce la marca e il modello

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Il fatto è che dovrei realizzare una casella di testo per una ricerca veloce...e solamente dopo un tipo di ricerca avanzata che mi permette la scelta della marca e poi del modello.

Ma per una ricerca veloce, realizzata tramite una sola casella di testo, al momento non ho proprio idea su come procedere nel caso in cui la chiave di ricerca è composta da più parlole, del tipo "Hd-Eide Hitachi....

risposto 8 anni fa
whitewolf11
X 0 X

se i dati si trovano su più colonne postresti fare una LIKE su ciascuna colonna e cercare il testo in questo modo:

LIKE '%parola1%parola2%parola3'

Però MySQL dispone anche di un particolare tipo di ricerca detto FULL TEXT SEARCH che risolve egregiamente il tuo problema:

http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Mi sono documentato un pò per quanto riguarda la ricerca fulltext, però è sorto un problema non indifferente.

La ricerca fulltext è possibile solo a condizione che sia stato creato un full-text index, operazione chi si può fare al momento della creazione della tabella oppure modificando quella già esistente nel modo seguente:

ALTER TABLE nomeTabella ADD FULLTEXT(primoCampo, secondoCampo, terzoCampo);

Il problema è proprio questo: Ho provato a modificare la tabella su cui dovrei fare l'eventuale ricerca ma subito un errore: da quello che ho capito non posso modificare la mia tabella perchè è di tipo InnoDB e non MyISAM come dovrebbe essere. Purtroppo la tabella deve rimanere di tipo InnoDB per preservare i vincoli d'integrità......

Ora cosa faccio ?

Ho letto da qualche parte che una possibile soluzione è quella di crearsi una tabella copia...Nel mio caso dovrei crearmi una seconda tabella prodotti....cosa che non mi convince molto...perchè i prodotti sono davvero tanti...e crearsi un'altra tabella contenente 500 prodotti solo per implementare una ricerca full-text non la vedo proprio una buona soluzione......

Comunque il fatto che non si possa creare un full-text index con una tabella di tipo InnoDB mi sembra stranissimo......

Aspetto vostri suggerimenti.

Un saluto a tutti.

risposto 8 anni fa
whitewolf11
X 0 X

GLi indici fulltext purtroppo si possono creare solo su tabelle MyISAM. 500 prodotti sono pochissimi....

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Grazie per le indicazioni sulla ricerca full-text. Alla fine ho dovuto creare una tabella MyISAM fotocopia di quella che contiene i prodotti, però in compenso la ricerca funziona davvero bene.

A questo punto mi chiedevo solo una cosa:

1) E' più efficiente creare un sistema che esegue INSERT o UPDATE su le due tabelle (tabella prodotto + tabella fotocopia) ogni volta che si devono gestire i prodotti

oppure:

2) E' meglio eseguire, tramite un apposito script, un aggiornamento della tabella fotocopia dei prodotti mediante un tool di amministrazione gestito in back end.

?

Grazie ancora.

risposto 8 anni fa
whitewolf11
X 0 X

Secondo me è più conveniente replicare le operazioni fatte sulla tabella InnoDB anche sulla tabella MyISAM. In questo modo le due tabelle sono sempre sincronizzate e i risultati della ricerca sono più veritieri.

Non so se si può applicare anche in questa situazione ma sappi che MySQL è in grado AUTOMATICAMENTE di sincronizzare 2 database attraverso la "replicazione". Prova a fare una ricerca sulla documentazione ufficiale di MySQL.

Si potrebbe anche pensare di creare un TRIGGER che si occupi di sincronizzare le due tabelle.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ok, grazie mille!

 :bye:

risposto 8 anni fa
whitewolf11
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda