Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [MySQL] "ID Diverso da" che non funziona a dovere

    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:
    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
    Sostanzialmente, nel box delle notizie correlate vorrei che non fosse visualizzato il record della notizia che si sta leggendo!

    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
    codice:
    NOT IN($id_visualizzato)
    sempre senza risultato.
    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.
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  2. #2
    devi usare le parentesi
    prova così:
    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

  3. #3
    Avevo pensato alle parentesi, ma avevo posizionato male la prima (prima di AND) per cui mi restituiva sempre errore.
    Ho risolto, con il tuo aiuto, comunque.

    Grazie!
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.