Newsgroup: it.comp.www.php
Titolo: Problema con query

Premessa: ho già scritto su ficd.mysql
ho un problema con questa query:
SELECT  UserID
FROM    guestlist_valori_campi
WHERE   ListID='465'
         AND (
               (FieldID='156' AND Value LIKE '%ita%')
                  AND
               (FieldID='157' AND Value LIKE '%tri%')
         )
Non mi ritorna alcun record.
Ho la necessità di prendere tutti i UserID presenti in una tabella 
aventi ListID = 465 ed FieldID = 156 ed il valore di '%ita%' ED ANCHE 
FieldID = '157' con valore '%tri%'
In sostanza TUTTE le condizioni devono essere vere.
Se sostituisco l'AND centrale con un OR, funziona tutto, però ovviamente 
mi ritorna anche i record aventi o (FieldID='156' AND Value LIKE 
'%ita%') TRUE oppure anche solo (FieldID='157' AND Value LIKE '%tri%') TRUE
Sapete aiutarmi?
la tabella è così:
|---------|---------|----------|----------|
|ListID   |FieldID  |Value     |UserID    |
|---------|---------|----------|----------|
|465      |156      |ita       |11111     |
|465      |157      |tri       |11111     |
|465      |156      |ita       |22222     |
|465      |157      |tri       |22222     |
|465      |156      |fra       |33333     |
|465      |157      |tri       |33333     |
|---------|---------|----------|----------|
Lo scopo, è tirar fuori gli utenti '11111' e '22222' in quanto hanno:
ListID = 465
AND (FieldID=156 AND Value LIKE '%ita%')
AND (FieldID=157 AND Value LIKE '%tri%')
L'utente 33333 NON deve apparire, in quanto 156=fra
La query non da errore, semplicemente non trova nulla.

 La query non da errore, semplicemente non trova nulla.
C'è qualcosa che non mi quadra.
come fa un campo a essere contemporaneamente =156 E =157 ? Non può essere...
select userid from guestlist_valori_campi a join guestlist_valori_campi 
b on a.userid = b.userid where
a.FieldID=156 AND a.Value LIKE '%ita%' and
b.FieldID=157 AND b.Value LIKE '%tri%'
prova così... non testata.
-- 
Jax

 prova così... non testata.
Meglio ancora (testata e sembra funzionare):
SELECT DISTINCT a.userid
FROM guestlist_valori_campi a
JOIN guestlist_valori_campi b ON a.userid = b.userid
WHERE a.FieldID =156 AND a.Value LIKE '%ita%'
AND b.FieldID =157 AND b.Value LIKE '%tri%'
-- 
Jax


Ciao, e intanto grazie.
Ora sono fuori quindi non posso testare.
Comunque, mi pare di capire che debba fare delle join per ogni fieldID
che devo matchare.
Prima l'ho fatta troppo semplice.
Tale query viene generata dinamicamente in base ai filtri che imposta
l'utente.
Tali filtri possono essere infiniti (sono dinamici, uno può creare 1
filtro come 10000) quindi la mia query avrà infinite join.
Credo sia un bel collo di bottiglia in termini prestazionali.
Comunque si, hai ragione, non può essere sia 156 che 157. Ecco perchè
non andava con una semplice and.
Ma non è possibile dire di prendere tutti i record aventi sia fieldID
= 156 che FieldID=157?
Se dovessi controllare SOLO l'id del campo potrei fare " AND FieldID
IN (156,157, ...) " ma io devo anche controllare che il 156 abbia un
dato valore ed il 157 ne abbia un altro ben preciso.
Spero ci sia una soluzione senza join...

 Spero ci sia una soluzione senza join...
Lo so, infatti secondo me il database non è stato progettato in modo 
corretto, o perlomeno non è stato progettato per fare quello che vuoi tu.
Un possibile workaround (mi sembra che funzioni) che mi viene in mente è 
questo:
select userid from guestlist_valori_campi where
(FieldID=156 AND Value LIKE '%ita%') or
(FieldID=157 AND Value LIKE '%tri%')
group by userid
having count(userid) >= 2
Dove 2 lo imposterai dinamicamente = al numero di condizioni che devi 
soddisfare. In questo modo, se non vengono soddisfatte tutte, il record 
non viene estratto... mi sembra la soluzione migliore!
-- 
Jax


In effetti, in origine era proprio così (leggi la query al mio primo
post), solo che mancava il " HAVING COUNT(userid) >= 2 "
Ed in effetti mi tirava fuori tutti i record aventi sia entrambe le
condizioni vere che anche solo una (proprio per via del OR).

 condizioni vere che anche solo una (proprio per via del OR).
E sticazzi, perň almeno un grazie per averti risolto il problema (non 
banale), no? :(
-- 
Jax