Escludere stringhe contenute nei record da una select

peppeocchi

Utente Attivo
20 Apr 2013
30
0
0
Salve,

Come da titolo, devo escludere una serie di stringhe che possono essere contenute in una tabella.

Ad esempio l'utente inserisce come stringhe da escludere "parola1, parola2, parola3".

Come soluzione ho optato per forzare l'utente ad inserire le stringhe come "parola1|parola2|parola3" passando quindi alla query (da php) una variabile contenente la stringa "parola1|parola2|parola3"
Quindi nella query ho
Codice:
select *
where campo NOT REGEXP '$variabile'

In linea di massima questa query funziona, ma quando un utente inserisce una parola tipo "ciao$ciao|parola2|parola3", la prima ovviamente non viene esclusa, ma solo parola2 e parola3.

Idee alternative?

Grazie :)
 
Vuoi che l'utente sia impossibilitato ad inserire delle parole decise da te?
Se si, quando l'utente inserisce una frase, controlli che in essa non ci sia quello che tu hai escluso.
Se l'unico problema è quello che hai constatato ci sia potresti utilizzare una explode fuori (sto dando per scontato che hai php-mysql, correggimi se sbaglio) e prendi le 3 parole separate per poi rifare un implode per unirle così come servono a te.
 
Si e no.
L'utente deve compilare un form per effettuare una ricerca, come esempio diciamo che deve cercare degli utenti di diverse città.

In questo form l'utente può inserire delle città da escludere dalla ricerca (non si conoscono a priori i nomi delle città, e fare una select delle città disponibili diventa un'operazione troppo costosa (su 80000 record) sommata a tutte le altre che l'applicazione già fa di base).

I nomi delle città salvate nel database possono contenere anche caratteri speciali, ad esempio può essere una lista tipo questa:

Milano
Rom$a
Altr$città

Quindi l'utente per escludere determinate città, le inserisce così come sono scritte, se vuole escludere Rom$a scriverà esattamente così (l'utente sa esattamente cosa inserire perchè sono dati di un'applicazione esterna alla mia).

Per semplificarmi il lavoro, forzo l'utente ad inserire le città da escludere separate da "|" in modo da dare direttamente in pasto a REGEXP la stringa passata (evitando di fare explode/implode con php).

Quindi diciamo i caratteri della stringa passata non li posso cambiare, altrimenti la ricerca non è corretta.

Probabilmente la soluzione migliore è quella di fare un explode con php e costruire la query con un ciclo.

A questo proposito, è più veloce una query tipo:

Codice:
select * from tabella where nome not in (nome1,nome2,nome3)
o
Codice:
select * from tabella where nome != 'nome1' and nome != 'nome2' and nome != 'nome3'
o sono la stessa identica cosa in termini di prestazioni?
 
Guarda per vedere quale è più efficiente basta fare delle prove e vedere i tempi di esecuzione.
Se chiedi quale è più leggible ovviamente il primo e si può facilmente adattare per più parole senza mettere mano alla query.
 

Discussioni simili