Newsgroup: it.comp.software.database
Titolo: Aiuto per query

Supponete che io abbia tre tabelle fatte cosi':
PRODOTTI
id_prodotto
nome
id_azienda
PRODOTTI_VALORI
id_prodotto
id_valore
VALORI
id_valore
id_criterio
Alcuni dati di esempio
PRODOTTI
id_prodotto   nome_prodotto
1	      prod_1
2 	      prod_2
3	      prod_3
PRODOTTI_VALORI
id_prodotto   id_valore
1		1
1		3
1		16
1		25
2		1
2		3
2		16
2		32
3		1
3		2
3		16
VALORI
id_valore	id_criterio
1		25
...
3		26
....
16		27
supponiamo che io conosca alcuni id_criterio e debba risalire ai nomi 
dei prodotti che assumono 1 o piu' di quegli id_valore corrispondenti 
agli id_criterio. Come faccio ?
Mi spiego meglio :
conosco i seguenti id_criterio :  in questo caso  25 , 26   27
per cui voglio trovare  gli id_valore corrispondenti ( 1 , 3 , 16 )
e voglio trovare TUTTI e SOLI gli id_prodotto (in questo caso 1 e 2 ma 
NON 3) e poi nome_prodotto a cui corrispondono gli id_prodotto
Si puo' fare tutto in una query ? magari  efficiente ?
Ho fatto un po' di prove ma con scarsi risultati ...
Uso Mysql versione 3.23.58
 
Grazie in anticipo a chi mi potra' aiutare
Michele

 Michele
Di niente...
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello (A. Celentano).
  ___   _   ___ _  _______   _______ ___
|   \ /_\ | _ \ |/ / _ ) \ / /_   _| __|
| |) / _ \|   / ' <| _ \\ V /  | | | _|
|___/_/ \_\_|_\_|\_\___/ |_|   |_| |___|

 ha scritto
nel messaggio news:416427DC...@libero.it...


 all'id_valore 1, che a sua volta è legata all'id_criterio 25...


>Forse la riga (3,1) non anadava in 'prodotti_valori'?
La tua query e' perfetta per  trovare  tutti i prodotti che soddisfano 1 
SOLO valore . Il mio problema e' che i parametri selezionati  possono 
oscillare da 1 a 5 ( e i corrispondenti valori possono assumere anche 
piu' di 5 valori se consideriamo le condizioni parametro NN SELEZIONATO 
per il quale devo considerare tutti i valori possibili assunti dal 
paramtro stesso. Es. l'utente non specifica il prezzo perche'0 non gli 
importa o vuole comunque vedere tutti i prodotti con determinate 
caratteristiche e solo in un secondo momento restringere la ricerca con 
i  prezzi).
Nella mia domanda avevo cercato di impostare un esempio abbastanza 
generale (ma non troppo articolato) proprio per fare in modo che i 
valori di selezione fossero piu' di uno (ne avevo messi 3)
Traduco a parole quello che intendevo chiedere con l'esempio di dati che 
avevo considerato e che ripropongo di seguito:
Conosco i dati delle tabella VALORI (dati che di fatto mi provengono dal 
FORM HTML, i cui parametri sono  diversi da categoria a categoria di 
prodotti)
Siamo nel caso in cui l'utente ha impostato dal menu a tendina i valori 
di 3 parametri (il parametro 25 settato a 1 , il parametro 26 settato a 
3, il parametro 27 settato a 16) IGNORIAMO PER IL MOMENTO I DUE RESTANTI 
PARAMETRI e i relativi casi di non selezione (che corrispondebbero alla 
selezione di tutti i valori possibili)
Come faccio a trovare tutti i prodotti nella tabella PRODOTTI_VALORI che 
  soddisfano i valori 1,3,16 CONTEMPORANEAMENTE ?
Il risultato desiderato sarebbero SOLO i prodotti con id_prodotto 1 e 2
il prodotto con id_prodotto=3 NON  "soddisfa" id_valore = 3 e quindi non 
e' fra i prodotti richiesti (es prezzo superiore a 500 euro)
Riesco a fare questa selezione che tenga conto di tutti i valori assunti 
dai parametri simultaneamente  con una query ?
o devo fare piu' query ?
o mi consigliate di  rivedere la struttura del DB che riporto di seguito 
in fondo ?
PRODOTTI_VALORI
id_prodotto   id_valore
1        	1
1        	3
1        	16
1     		25
2        	1
2        	3
2        	16
2        	32
3        	1
3        	2
3        	16
VALORI
id_valore    id_criterio     nome
1        	25	     fino a 500 Euro 	
....				
3   	     	26	     fino a 2 metri 	
.....
16       	27           fino a 30 KG
PRODOTTI
id_prodotto     nome		id_azienda
1		prod_1		   4
2		prod_2		   7
3 		prod_3		   9
Le altre tabelle del DB:
CRITERI_RICERCA
id_criterio
nome
id_categoria
Es:   ( 1 , Prezzo , 4)
CATEGORIE
id_categoria
nome
ES   ( 4 ,  Categoria_mio_oggetto)
AZIENDE
id_azienda
nome
ES   ( 5 , "Acme Spa" )
Sussisterebbero le seguenti relazioni fra le tabelle.
1) Un prodotto e' associato a una sola azienda
Un'azienda puo' presentare piu' prodotti
Relazione 1 -> n   (AZIENDE - > PRODOTTI)
2) Una categoria puo' avere  1 o piu' CRITERI di ricerca che sono 
specifici per ogni categoria     (in realta' il numero di parametri per 
categoria oscilla da 3 a 5)
Relazione 1 -> n  (CATEGORIE -> CRITERI DI RICERCA)
3) Ogni "criterio di ricerca"  puo' assumere diversi valori
Es prezzo  :  (fino a 500 euro, da 500 a 1500, da 1500 a 3000, da 3000 a 
5000,  oltre  5000 ) etc ...
Relazione 1 -> n  ( CRITERI_RICERCA -> VALORI )
Il parametro prezzi e ' comune a molte categorie ma il range dei prezzi 
varia di categoria a categoria, per cui un amico mi ha consigliato in 
relazione a punto 2) di sopra di trattare la relazione  come 1->n invece 
che   n->m  (tanto piu' che il numero di categorie e finito : circa 50)
4) Ogni prodotto appartiene ad una sola categoria
Una categoria puo' contenere diversi prodotti
1 -> n  ( CATEGORIE -> PRODOTTI)
5) Ogni prodotto puo' assumente determinati valori e ogni valore puo' 
essere assunto da  piu' valori
Relazione n -> m  fra PRODOTTI e VALORI
con introduzione della tabella PRODOTTI_VALORI che dovrebbe tradurre la 
relazione n->m
###########################################
Grazie per l'aiuto e la dispobilita'
Ciao
Michele
###########################################


Ora credo di aver capito quello che vuoi ottenere... scusami se prima non
avevo afferrato.
Per come la vedo, devi risolvere in due passi:
1) con una select di creazione ti crei una tabella temporanea che contiene
le coppia id_prodotto-id_criterio che cerchi
2) selezioni gli id_prodotto che esistono per ogni id_criterio.
Però riflettendoci, mi sa che questo si può fare fare soltanto con delle
subquery, e qui non ti posso più aiutare, perché la mia versione è la
3.23.xx, che non supporta subquery, perciò non ho modo di provare
un'eventuale soluzione.
Spero cmq di esserti stato d'aiuto. Ciao!

 Spero cmq di esserti stato d'aiuto. Ciao!
Si mi sei stato molto d'aiuto!
Ti ringrazio per la risposta e per il tempo che hai speso.
Vedro' come fare !
Mi sa che alla fine per non fare i salti mortali con queste query faro' 
una 50 ina di micro DB (uno per ogni categoria)  e me ne infischio di 
buona progettazione e normalizzazioni varie .. (anche perche' i dati che 
ci andranno dentro non sono prevedibilmente moltissimi).
Grazie di nuovo ciao
Michele

Ho risolto cosě:
  SELECT Prodotti.*
  FROM
  ( Valori INNER JOIN Prodotti_Valori PV
    on pv.id_valore=valori.id_valore
  ) inner join prodotti
  on pv.id_prodotto=prodotti.id_prodotto
  where valori.id_criterio in (25,27)
  group by pv.id_prodotto
  having count(pv.id_valore)=2
Solo che la query la devi costruire in run-time.
Hai detto che la gente sceglie delle opzioni riguardo i prodotti, e 
queste opzioni (da cui scaturiscono i numeri di esempio 25, 26, 27 che 
hai citato) possono essere 2 o 3 o 1 sola.
Quindi devi fare in modo di sapere QUALI sono i numeri (ID_CRITERIO) da 
usare nella query e QUANTI sono: in questo modo ricostruisci la query 
inserendo i numeri nella parentesi della clausola WHERE e il controllo 
dell'HAVING. Praticamente devi fare una cosa tipo:
  SELECT Prodotti.*
  FROM
  ( Valori INNER JOIN Prodotti_Valori PV
    on pv.id_valore=valori.id_valore
  ) inner join prodotti
  on pv.id_prodotto=prodotti.id_prodotto
  where valori.id_criterio in (#CRITERI#)
  group by pv.id_prodotto
  having count(pv.id_valore)=#NUMCRITERI#
sostituendo alla stringa #CRITERI# i numeri dei criteri scelgi, e alla 
stringa #NUMCRITERI# il NUMERO criteri scelti (1 o 2 o 3 ... o n); dopo 
aver fatto queste sostituzioni, lanci la query.
Spero di esserti stato di aiuto :)


 Spero di esserti stato di aiuto :)
Mi ero diretto verso altri lidi e ho letto solo oggi il tuo messaggio !
Molte grazie per la risposta.
Ho un po' spezzato il tutto, e la tua risposta con qualche adattamento alla
nuova situazione mi sara' molto utile!
Ti spediro' un panettone per natale ;-)
Ciao
MB

 MB
Ciao
Darkbyte
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).
