Buongiorno.
Nell'ambito della ristrutturazione di un vecchissimo sito di cui vi ho già detto, sto riscontrando un problema in una query dinamica che non capisco come risolvere.
Scenario
Ho un DB di notizie a cui è stato aggiunto il campo dei tag.
Per ogni notizia visualizzata, si fa una ricerca (parallela) su altre tabelle per cercare tutta una serie di informazioni correlate, nonché vecchie notizie presenti nella tabella NEWS per gli stessi tag.
Problema
Facendo la premessa che la ricerca non è di tipo fulltext, ma diciamo "old-school" con un classico LIKE, riscontro questo problema.
Nella pagina di lettura della notizia ho un box laterale in cui riporto una lista di notizie correlate per tag a quella visualizzata.
La query generata dalla funzione è dinamica e prevede la ricerca per tag nel campo TAG della tabella, e nei campi di titolo e testo delle varie notizie.
La query risulta essere del tipo:
Sostanzialmente, nel box delle notizie correlate vorrei che non fosse visualizzato il record della notizia che si sta leggendo!codice:SELECT id, data, titolo FROM news WHERE id <> $id_visualizzato AND tag LIKE '%tag1%' OR titolo LIKE '%tag1%' OR corpo LIKE '%tag1%' OR tag LIKE '%tag2%' OR titolo LIKE '%tag2%' OR corpo LIKE '%tag2%' AND vis = 1 ORDER BY id DESC LIMIT 30
Arrivo al punto
Nonostante la prima clausola di WHERE sia proprio quella relativa all'ID del record, la presenza degli OR mi fa saltare la clausola stessa e mi fa visualizzare la notizia del record che non vorrei visualizzare proprio come prima della lista.
Ho provato a spostare la clausola in fondo, come ultima, per capire se eseguirla come ultima aiutasse nel processo, ma senza risultato.
Ho provato ad utilizzare la clausola
sempre senza risultato.codice:NOT IN($id_visualizzato)
Ho provato a sostituire gli OR, con degli AND ed ho notato che in quel modo l'ID visualizzato viene tolto dalla query, ma che (ovviamente) ottengo dei falsi negativi, in quanto le restrizioni sono obbiettivamente troppe.
Come posso risolvere secondo voi da MySQL, senza dovere fare dei controlli sull'ID da PHP?
grazie.
![]()