Newsgroup: it.comp.www.asp
Titolo: questa query mi sta facendo diventare matto...

devo realizzare questa query (su access 97/2000) ma proprio non ci riesco...
vediamo se qualcuno riesce ad aiutarmi: (o se avete un ng + adatto da
consigliarmi, fate pure)
lo schema delle tabelle è questo:
members(id, name, gold, points)
groups_members(member_id, group_id)
groups(id, name)
ogni groups può contenere N member, e ciò è fatto da groups_members.
devo fare una query che mi riporti tutti i gruppi ordinati in base alla
somma prima di gold e poi di points dei membri appartenenti a ciascun
gruppo.
A dirlo pare facile ma mi sta facendo diventare matto, ho il cervello in
ricorsione...
Un esempio di risultato:
group name, total members gold, total members points
pippo, 200, 100
paperino, 150, 300
orazio, 120, 110
pluto, 120, 80
paperone, 90, 210
....
--
- Vuoi un portale ASP gratuito e già pronto?
http://www.maxwebportal.com
- Vuoi rispondermi in privato?
togli LE_MUTANDE

Umm, la struttura delle tabelle deve rimanere questa per forza?
Perche ci sarebbe una piccola incongruenza: come l'hai impostato te,
presuppone una relazione molti a molti, mentre tu mi dici che vuoi una
relazione 1 a molti (cioe a un gruppo corrispondono N member, ma a un member
non corrispondono N gruppi, o sbaglio?) Quindi in questo caso non dovresti
fare una tabella di disaccoppiamento groups_members ma mettere group_id
direttamente nella tabella members.
Oltretutto, credo che i tuoi "gold" e "points" nella tabella members siano
due boolean. é un tantino complesso in questo caso perche dovresti fare
almeno due select, una WHERE gold = true e l'altra WHERE points=true
Cmq, se vuoi usare questa struttura devi cmq fare due query, del tipo
SELECT G.Name, Count(G.id) AS NumeroGold
FROM Groups G INNER JOIN
    groups_members GM ON GM.group_id = G.id INNER JOIN
    members M on M.id = GM.member_id
WHERE M.Gold = 1
GROUP BY G.Name, G.id
Per i points metti M.Points = 1
Dopo però devi fare in modo che i due recordset scorrano contemporaneamente
e quello potrebbe essere una noia,
--
Alessandro
UGIdotNET - 
http://www.ugidotnet.org

 GROUP BY G.Name, G.id
non era così', spero di essermi spiegato meglio ora.
Scrivendola in maniera intuitiva io scriverei:
select 
groups.name
, sum(points), sum(gold)
from groups, groups_members, members
where 
members.id
 = groups_members.member_id
and groups_members.group_id = 
groups.id
ovviamente non funziona...
credo si debba fare con due query annidate (in cui la seconda prende un
parametro dalla prima), ossia la select più esterna si muove sulla tabella
groups, mentre quella più interna per ogni groups trovato dalla prima
calcola la somma dei gold e points dei membri che appartengono al corrente
group.
Aiuto... sto diventando matto! ;)


Beh cosi' hai semplificato le cose :)
SELECT G.Name, SUM(M.Gold) AS NumeroGold, SUM(M.Points) AS NumeroPoints
FROM Groups G INNER JOIN
    groups_members GM ON GM.group_id = G.id INNER JOIN
    members M on M.id = GM.member_id
GROUP BY G.Name
Questa dovrebbe fare proprio al caso tuo!
Ciao


 GROUP BY G.Name
hmmm... mi da' errore di sintassi (operatore mancante) nell'espressione
della query "GM.group_id = G.id INNER JOIN members M on M.id = GM.member_id"
cos'è che mi sfugge?

Postami tutta la stringa SQL cosi' come te la stampa
cosi' a prima vista hai scritto un "INNER JOIN " di meno, ma non saprei
dirtelo se non posti tutto!


 Postami tutta la stringa SQL cosi' come te la stampa
non me la stampa perchè non la sto eseguendo da asp ma da access... cmq la
query che mando in esecuzione è:
SELECT GROUPS.G_NAME, SUM(MEMBERS.M_GOLD) AS NumeroGold, SUM(MEMBERS.M_REP)
AS NumeroPoints
FROM GROUPS G INNER JOIN
    groups_members GM ON GM.g_group_id = G.id INNER JOIN
    members M on M.member_id = GM.g_member_id
GROUP BY GROUPS.G_NAME
l'alert che mi riporta dice esattamente:


 
Dall'errore credo che il campo id che passi al database per fare il confronto sia
vouoto come lo recuperi il valre del campo id che passi al db per il confronto?
MI spiego meglio la condizione h "nome id del campo db=nome id del valore che passi
tu" io credo che nell'id che passi al db non ci sia nulla. 
GM.group_id = G.id INNER JOIN members M on M.id = GM.member_id"
uno di questi due valore che passi e vuoto credo il secondo
--
Enjoy the .NET community! ASPItalia.com
 
http://forum.aspitalia.com/
 
http://www.aspitalia.com/

A dire il vero quell'eguaglianza non si riferisce a nome campo del db = nome
valore passato da codice, è un'eguaglianza della join e si riferisce a due
campi del db posti uguali per creare una relazione tra le due tabelle...
Cmq, non so cosa dirti... credo che access sia un po pignolo con le
parentesi o con gli alias...
prova un po nello stesso modo ma mettere "INNER JOIN Members AS M", cioè
aggiungere l'AS come campo dell'alias
oppure levare proprio gli alias :P
Fammi sapere
