Newsgroup: it.comp.www.php
Titolo: domandona sul operatore di confrondo in SQL

Ciao a tutti,
ho un problemino (.. in verità problemone) cioè ho un database con
una tabella di nominativi divisi in bar e barche e tramite una pagina
php cerco il nominativo che mi serve.
nome    categorie   provincia
PIPPO  BAR         VE
PLUTO  BARCHE  VE
Se cerco BAR mi esce BARCHE..
il problema stà SICURAMENTE nella riga di codice che cerca le parole:
select codice from categorie where lower(nome) like
'%".strtolower(dbq($c))."%'
funziona in parte... ma mi trova le parole anche parzialmente
all'interno di altre cioè...
se cerco bar mi trova barche..
io vorrei che cercasse solo la parola intera come potrei fare??
un grazie a chi mi aiuta,
ciao

un grazie a chi mi aiuta,
cosa vuoi che ti faccia quindi.
per forza che ti trova anche barche perchč gli dici in parole povere questo:
....like '%bar%'
e lui ti trova tutte le parole che contengono bar
'bar%' tutte le parole che iniziano per bar
'%bar' tutte le parole che finiscono per bar
_ č un carattere jolli ecorrisponde a un carattere qualsiasi
'_bar' trova tutte le parole di 4 caratteri che finiscono per bar
'__bar' parole di 5 caratteri che terminano in bar
se vuoi fargli trovare solo bar fai senza like. metti direttamente
where campo='bar'.
ciaux 

io vorrei che cercasse solo la parola intera come potrei fare??
Con il % davanti e dietro alla stringa è normale che trovi anche le 
ricorrenze parziali.
se li togli entrambi troverà solo le ricorrenze uguali.
R. 

 _ è un carattere jolli ecorrisponde a un carattere qualsiasi


ricerca sul parziali (per es. BARche)
Sistema brutto:
	select codice from categorie where CONCAT(' ',lower(nome),' ')
like '% ".strtolower(dbq($c))." %'
...sarebbe meglio usare le regexp, a questo punto...
Leonardo
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?

In realtà questo denota una cattiva progettazione del database, prova
così:
categorie
ID      DESCRIZIONE
-----------------------------------------
1       Bar e Caffè
2       Barche e canotti
3       Ristoranti e Trattorie
attivita_commerciali
ID      CATEGORIA      DESCRIZIONE
-------------------------------------------------------
1       3                       Paperino
2       1                       Pippo
3       2                       Pluto
Così sono indicizzate meglio, l'engine del db le trova prima e al
variare di una categoria, non devi aggiornare tutti i record di
'attivita_commerciali'.
Per quanto riguarda la ricerca ti consiglio di utilizzare il tag HTML
select, in modo da proporre tutte le categorie e l'utente è già sul
binario giusto x quanto riguarda le scelte.
Così la query sarà semplicissima:
select * from attivita_commerciali where categoria = SCELTA
Dove SCELTA è il risultato dell'input.
Ciao

 
$q = sprintf("select codice from categorie where nome regexp 
'[[:<:]]%s[[:>:]]'", addslashes(dbq($c)));
NB: la regexp e' pero' lenta, oltre al fatto di non poter usare indici
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 
Normalizza il database, ovvero fai 2 nuove tabelle, una contenente (id 
,descrizione_categoria) e poi un'altra tabella contenente (id_nome, 
id_categoria)
Sembra complesso ma ottieni ottimi risultati, è molto più veloce e 
flessibile
	Francesco

l'engine e il database sono disposti in questa modo.
la ricerca è veloce ma non riesco a dire al comando sql di cercare una
parola INTERA all'interno del campo descrizione (categorie)
l'unica maniera è %$c% cioè cerca la parola e anche il parziale
"BARche" se cerco BAR.
non esiste una soluzione dove se cerco BAR mi trova solo i campi che
contengono la parola BAR???
grazie
jodosha ha scritto:


 contengono la parola BAR???
Per favore quota bene.
Come diceva Leonardo, devi usare le regexp, e fare il match per inizio e
fine parola.
Bye.

 contengono la parola BAR???
Vd. mio post di risposta di ieri:
SELECT codice FROM categorie WHERE nome REGEXP '[[:<:]]BAR[[:>:]]';
ovvero:
$query = sprintf("select codice from categorie where nome regexp 
'[[:<:]]%s[[:>:]]'", addslashes($c));
Provato se funziona?
(*) per: [[:<:]]parola[[:>:]] , vedi doc mysql regexp


contengono la parola BAR???
Maremma tortella, ma BARCHE *CONTIENE* la parola BAR! La soluzione di
jodosha e' quella piu' corretta per la ricerca. Per la selezione devi
trovare un sistema per scegliere le categorie.
Per esempio crei una tabella di ricerca categorie cosi':
categorie
ID	DESCRIZIONE	RICERCA
1	Bar e caffe'	|BAR|CAFFE|CAFFE'|CAFFè|BARRINI|ABBEVERATOI|
2	Barche e ca...	|BARCHE|CANOTTI|CANNOTTI|NATANTI|PEDALONI|
3	...
Poi cerchi dove $cerca e' ESATTAMENTE UGUALE a descrizione, *oppure*,
dove la concatenazionen di |,$cerca,| e' CONTENUTA in RICERCA. Questo
ti consente di ricavare un ID: 1 per BAR, 2 per BARCHE.
A questo punto cerchi quell'ID nell'elenco, facendo anche molto prima
dato che le categorie (dove cerchi stringhe) sono poche, mentre sulla
tabella principale tu cerchi un intero. Con un indice, fai pressoche'
all'istante.
Ottima anche l'altra idea di jodosha di usare una SELECT.


gentilissimo Leonardo,
provo a vedere quale soluzione adottare e quella meno incasinata.. ;=)
al limite chiederò un vostro aiuto, grazie
Leonardo Serni ha scritto:


ciao,
non mi è chiaro un aspetto sul realizzarlo, credo che il metodo sia
ottimo per arrivare al dunque...
io ho oggi una query:
$q ="select codice from categorie where lower(nome) like
'%".strtolower(dbq($c))."%'";
dove controlla che la parola cercata nella variabile $c sia nella
tabella "categorie" -> colonna "nome"
come consigli tu...
1) vado a creare sempre nella tabella "categorie" una nuova colonna
chiamata "ricerca" dove metto le parole della categoria più le
varianti .
2) poi utilizzo una funzione di CONCATENAZIONE...mmm.. ecco qui mi
fermo come posso modificare la query con quello che tu mi consigli?
grazie,
Leonardo Serni ha scritto:


fermo come posso modificare la query con quello che tu mi consigli?
	$c = strtolower(dbq($c));
	$q = SELECT id FROM sinonimi WHERE lower(nome)
		LIKE '%|$c|%';
Questo ti tira fuori l'ID, che metterai in $id, dopodiche'
	SELECT quellochetipare FROM categorie WHERE id = $id;
