Ciao a tutti,
sto sbattendo la testa su una query di ricerca sulla quale non riesco a venire a capo.
La situazione:
Una ricerca di immagini
Ci sono parecchie tabelle nel DB ma a noi ne interessano tre. Allego le query CREATE delle tre tabelle (semplificate)
In sostanza i nomi dei tag sono nella tabella "it_tag", i dati delle immagini nella tabella "it_image" mentre la tabella "it_image_tag_connect" li mette in connessione assegnando ad ogni immagine un certo numero di tag.codice:CREATE TABLE IF NOT EXISTS `it_image` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `title` varchar(255) DEFAULT NULL, `descrizione` varchar(255) DEFAULT NULL, `time` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; CREATE TABLE IF NOT EXISTS `it_image_tag_connect` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tag_id` int(11) NOT NULL, `image_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; CREATE TABLE IF NOT EXISTS `it_tag` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nometag` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
Quello che devo fare (e che sto provando a fare da due giorni senza ottenere esattamente quello che voglio) è di effettuare una ricerca in queste tabelle inserendo una parola chiave andando a verificare i campi "title" e "descrizione" della tabella "it_image" e i tag.
Ad esempio: se inserisco la parola "fiore" la query dovrà restituire un valore positivo per tutte le immagini che hanno la parola fiore nel "title" OPPURE nella "descrizione" OPPURE in uno dei suoi tag correlati.
Se aggiungo un'altra parola poi, e quindi abbiamo "fiore" e "pianta", la query mi dovrà restituire tutte le immagini che hanno entrambe le parole ma non necessariamente in ognuno dei campi interessati.
La query che ho scritto finora fa (quasi) tutto:
Versione con una parola inserita
Versione con due parole inseritecodice:SELECT i.* FROM it_image AS i, ( SELECT t.titolo, it.tag_id, it.image_id FROM it_tag AS t, it_image_tag_connect AS it WHERE t.id = it.tag_id AND (t.titolo = 'fiore') ) AS t WHERE i.status = 'online' AND (i.id = t.image_id OR ( (i.title LIKE '%fiore%' OR i.descrizione LIKE '%fiore%') )) GROUP BY i.id ORDER BY i.time DESC LIMIT 0, 25
Il problema che ho è che questa query non funziona se la parola chiave inserita esiste solo nei campi "title" e "descrizione" dell'immagine ma non c'è un tag con quella parola, mentre invece siccome trova la parola (ad esempio) nel titolo la dovrebbe restituire.codice:SELECT i.* FROM it_image AS i, ( SELECT t.titolo, it.tag_id, it.image_id FROM it_tag AS t, it_image_tag_connect AS it WHERE t.id = it.tag_id AND (t.titolo = 'fiore', t.titolo = 'pianta') ) AS t WHERE i.status = 'online' AND (i.id = t.image_id OR ( (i.title LIKE '%fiore%' OR i.descrizione LIKE '%fiore%') || (i.title LIKE '%fiore%' OR i.descrizione LIKE '%fiore%') )) GROUP BY i.id ORDER BY i.time DESC LIMIT 0, 25
Qualcuno può aiutarmi? Non so più cosa fare.
Grazie a tutti
Federico

Rispondi quotando