Newsgroup: it.comp.www.php
Titolo: [OT] [MySql] query confronto stringhe

Ciao all,
  con  una  query  devo  recuperare  tutti  i  record  in cui il campo
  categoria contiene (tra gli altri) il valore "1".
  io avevo messo WHERE Categoria LIKE "%1%" e funzionava (i dati sono
  memorizzati in un array e possono essere [1, 2, 5, 10, 11] e vanno
  da 1 a 11, questo xè un cliente può appartenere a + categorie)
  solo che mi sputa anche i risultati in cui Categoria è SOLO = '11'
  e  ciò  non mi va bene per ovvie ragioni
  Ho provato a guardare il manuale di mysql ed ho trovato le regexp ma
  non  sono comunque riuscito a venirne a capo (dovrei poter esprimere
  una  cosa del tipo "scegli da categorie dove categoria contiene '%1%'
  ma non contiene il solo '11'")
  come posso fare?
  grazie
-- 
I migliori saluti,                 Scrivi a:
 .:Alias:.                  alias2k at libero dot it

   da 1 a 11, questo xè un cliente può appartenere a + categorie)
In linea di principio direi che (IMHO!) è sbagliato lo schema del database.
Per quale motivo devi usare un attributo che specifica multiple 
categorie ? non era meglio fare una ulteriore relazione tra i clienti e 
le categorie alle quali appartiene ?
Voglio dire... Se tu poni in Categoria il valore [1, 2, 3] allora il 
cliente appartiene alle categorie 1,2 e 3.
Creando un'altra tabella con (id_cliente, categoria) potevi memorizzare 
le associazioni tra i clienti e le categorie di appartenenza
ID_Cliente | Categoria
----------------------
     1      |     1
     1      |     2
     1      |     3
----------------------
In questo modo con un semplice Join ottenevi tutti i clienti di una data 
categoria
Select nome_cliente from Clienti as C, Associazioni as A where 
C.id=A.ID_Cliente and A.Categoria=1
Tra l'altro credo che sia un pò più performante (però dipende molto da i 
volumi delle due tabelle), nel senso che anche se qui fai un Join e 
nella tua query no, nella tua query chiami in causa l'analisi di una 
espressione regolare PER OGNI record della tabella!
I DBMS sono principalmente progettati per contenere informazioni, non 
tanto per eseguire operazioni su di esse, quindi è presumibile che un 
Join sia più ottimizzato di una SELECT con REG_EXPR da parsare.
Ciao
Alesi_27

 espressione regolare PER OGNI record della tabella!
sì  ma  succede  solo  in  un  caso ed era abbastanza limitato xè sono
sicuro  che  i  risultati  in  questo  caso  non  superano la 20ina di
record...
tuttavia  hai  sicuramente ragione ma è un lavoro che è iniziato in un
modo e proseguito in un altro.
dopo circa un mese di lavoro (e dati già inseriti) mi è stato detto di
permettere che una azienda potesse appartenere a più categorie...
io avevo già la mia struttura
azienda       |      categoria
--------------------------------
idazienda
idcategoria  <1:1>  idcategoria
etc
che è diventato
azienda              |             categoria
-------------------------------------------
idazienda
idcategoria        <1:n>         idcategoria
^^^^              ^^^^^^^
trasformato       taroccato! :)
in varchar        [1,2,3 ... ]
ma  mi  tornava  male dover ricambiare la struttura con già dei valori
dentro...
cmq  se  non  si  può  fare  dovrò  per  forza  ricambiare  lo schema,
reinserire i dati in maniera corretta e, darmi pace.
altre idee?
e cmq in caso della regexp come si sarebbe potuto fare?
ciao e grazie
-- 
I migliori saluti,                        Scrivi a:
 .:Alias:.                       alias2k at libero dot it
                                  (ancora per poco)

 e cmq in caso della regexp come si sarebbe potuto fare?
che cosa sarebbe  varchar [1,2,3 ... ]
una stringa con tutte le parentesi []? una sequenza di interi separati 
da virgole in una stringa? che altro?
di sicuro non con %1% che significa qualsiasi cosa prima di 1 e 
qualsiasi cosa dopo 1 per cui anche 21, 9999915973649857295876 e 
qualsiasi cosa contenga 1.
se per esempio sei sicuro che la codifica è 'spazio1,' devi mettere 
" 1,"
non stai cercando una espressione regolare, ma un pattern specifico!!!
In funzione di come è codificato il campo comunque dovrai fare una 
funzione (eventualmente in MYSQL) per ricercare la sottostringa pattern 
che ti interessa.
La soluzione che hai adottato per il problema che hai è sbagliata, 
controproducente, e soprattutto ti obbliga a tenere conto della scelta 
di codifica. Ti conviene trasformare tutto e leggerti un manuale sui 
Database.
Ciao Gianfranzo
-- 
ICQ#: 21258924 Nick Gianfranzo
Home page 
http://www.gianfranzo.it
Gianfranzo è contro la guerra
"dopo tutto, gli angeli non sono altro che dei volatili" D. Pennac

 Ciao Gianfranzo
(ma sei quello del "sono il vuoto che c'è dentro di te" ?!? ;)


 idcategoria  <1:1>  idcategoria
dalla fretta ho pure scritto una cavolata
in realtà la relazione all'inizio era molti a 1
quindi
 azienda       |      categoria
 --------------------------------
 idazienda
 idcategoria  <n:1>  idcategoria
 ed ora è diventata molti a molti


 (ma sei quello del "sono il vuoto che c'è dentro di te" ?!? ;)
proprio lui!! :)


 proprio lui!! :)
mitticoo! :)
(hai detto sandro?!? :)
bello  
gianfranzo.it
! è una scheggia! :)
(beh, è bello anche per altri motivi, diciamolo pure :D)
ciao!


 (beh, è bello anche per altri motivi, diciamolo pure :D)
grazie, ma un grosso difetto lo ha.... è in ASP (bé di difetti ce ne 
sono anche altri) :)
Ciao Gianfranzo
PS per la modifica con i codici a1... fai un dump della tabella, apri il 
file con un text editor, trova e sostituisci... parti da 11 con b0 e poi 
il resto è banale. Reimporti la tabella.
"se fossi figo"...;) non fare trova e sostituisci tutto, ma sbatti un 
po' di enter e controlla a vista (se ci sono molti campi numerici nella 
tabella potresti fare casino... e trovarti per esempio con i numeri di 
telefono a0a4a4a3 etc...


 telefono a0a4a4a3 etc...
già  già
vedo  che  hai  tu  esperienza del Find&Replace di dreamweaver? che ti
cerca   anche   in   tutto   il   sito  con,  potenzialmente,  effetti
catastrofici? :)))
cmq se vuoi dare un'occhiata al sito incriminato ti do il link (in pvt
però!)
ciao gianfra'
a  proposito,  se  ti  firmi  gianfranzo,  scrivilo tra i tuoi dati di
"mittente" altrimenti "The bat!" ti saluta con il tuo vero nome! :)))
ciao Giamma'
-- 
I migliori saluti,                        Scrivi a:
 .:Alias:.                       alias2k at libero dot it
                                 (solo fino a novembre!)

 ciao Giamma'
Ciao Gianfranzo
