|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Aug 2003
Messaggi: 72
|
[SQL] Problema con raggruppamento
Salve a tutti, qualcuno saprebbe aiutarmi con questa query?
Codice:
SELECT TOP 5 ArtWC_Eventi.ID_Evento, ArtWC_Eventi.Nome, ArtWC_Eventi.Descrizione, ArtWC_Eventi.DataInizio, ArtWC_MediaCatalogue.FileName, ArtWC_MediaCatalogue.Titolo FROM ArtWC_Eventi LEFT JOIN ArtWC_MediaLinks ON ArtWC_Eventi.ID_Evento = ArtWC_MediaLinks.ID_Item LEFT JOIN ArtWC_MediaCatalogue ON ArtWC_MediaLinks.ID_Media = ArtWC_MediaCatalogue.ID_Media WHERE ArtWC_Eventi.DataInizio > GetDate() AND (ArtWC_MediaLinks.ID_ItemCategory = 2 OR ISNULL(ArtWC_MediaLinks.ID_ItemCategory,0) = 0) GROUP BY ArtWC_Eventi.ID_Evento ORDER BY ArtWC_Eventi.DataInizio DESC Codice:
Column 'ArtWC_Eventi.Nome' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause
__________________
Visual Basic e dintorni Blog sullo sviluppo web Ultima modifica di simoneart : 25-03-2008 alle 19:22. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Nella select puoi selezionare solo gli attributi che metti nel group by o puoi attuare una funzione di aggregazione sugli attributi non presenti nel group by.
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Ma cosa avresti voluto fare?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Aug 2003
Messaggi: 72
|
La teoria l'ho capita ma non la pratica... quale funzione di aggregazione posso usare per prendere solo il primo valore per ogni condizione soddisfatta? In Access mi pare fosse First() ma in t-sql non conosco l'equivalente.
La query dovrebbe funzionare così: ho 3 tabelle, eventi, immagini e una tabella che lega immagini ed eventi. Eventi, MediaCatalogue e MediaLinks. Chiaramente ad ogni record nella tabella eventi (Evento) possono essere legate più immagini. Senza una funzione di raggruppamento, la query mi restituisce come risultato un elenco di eventi ma mi ripete ogni evento n volte quante sono le immagini collegate ad esso. Invece avrei bisogno di elencare una sola volta ogni evento e portarmi appresso eventualmente una sola foto collegata.
__________________
Visual Basic e dintorni Blog sullo sviluppo web |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
OK.
e quando invece per un dato evento le foto sono 2 (o piu'), cosa vorresti che venisse fuori? Di quali colonne comunque hai bisogno, nel risultato finale?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Scusa, ma se hai fatto un Join perché ti dovrebbe portare tutte le fotografie ? E in con quale criterio dovresti scegliere la fotografia ?
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Aug 2003
Messaggi: 72
|
Quote:
In questa query non ho bisogno di elencare le foto, quando ne avrò bisogno farò una join tra medialinks e mediacatalogue dove l'id del legame che cerco è uguale all'evento (o altro elemento) che mi interessa
__________________
Visual Basic e dintorni Blog sullo sviluppo web |
|
|
|
|
|
|
#8 | |
|
Member
Iscritto dal: Aug 2003
Messaggi: 72
|
Quote:
Codice:
SELECT TOP 5 ArtWC_Eventi.ID_Evento, ArtWC_Eventi.Nome, ArtWC_Eventi.Descrizione, ArtWC_Eventi.DataInizio, ArtWC_MediaCatalogue.FileName, ArtWC_MediaCatalogue.Titolo
__________________
Visual Basic e dintorni Blog sullo sviluppo web |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Allora il Join non ha senso: seleziona solo ArtWC_Eventi.ID_Evento, ArtWC_Eventi.Nome, ArtWC_Eventi.Descrizione, ArtWC_Eventi.DataInizio dalla tabella eventi...no ?
Poi la foto te la selezioni a parte successivamente con l'ID Evento nel Where. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Resta comunque l'ultima parte, che sarebbe: Per ciascun evento, selezionare la foto piu' recente (o la piu' vecchia, o la piu' grossa. Boh? Solo "la prima" non ha senso detta cosi'. La prima se li avessi ordinati per???), con tutti i suoi dati a disposizione. Poi tirare fuori tutto insieme oppure in 2 query separate sta poi a te. Comunque per quest'ultima parte dovresti: Una prima subquery per tirare fuori, per ciascun evento, quel e' il codice (PK) della foto interessata. (ovvero una subquery con GroupBy, e una funzione di gruppo tipo max) Tale subquery andra' messa in join con la tabella dalle foto, per tirare fuori i dati interessati, per ciascuna foto. Poi, se vorrai andare in join anche con la tabella degli eventi, per tirare fuori anche i dati interessanti per ciascun evento, quello stara' poi a te.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Aug 2003
Messaggi: 72
|
Non so se ho capito la vostra soluzione
A me serve (servirebbe) di ottenere quei dati con un'unica interrogazione. Vorrei ottenere come risultato un recordset del tipo: ID_Evento | Titolo | Descrizione | Data | PercorsoFoto In maniera tale da poter poi visualizzare i risultati con un semplice repeater. Non conosco l'id dell'evento che sto estraendo e l'id dell'evento non è legato all'immagine se non attraverso la tabella dei links per cui non saprei come mettere un uguaglianza del tipo id_evento = id_item nel WHERE. Per quanto riguarda le immagini, al momento non ha importanza l'ordine, mi basta tirarne fuori una qualsiasi.
__________________
Visual Basic e dintorni Blog sullo sviluppo web |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Una prima subquery per tirare fuori, per ciascun evento, quel e' il codice (PK) della foto interessata. (ovvero una subquery con GroupBy, e una funzione di gruppo tipo max)
Codice:
SELECT id_evento,max(id_media) maxmedia FROM mediaLinks GROUP BY id_evento Codice:
SELECT pippo.id_evento,MediaCatalogue.* FROM
(SELECT id_evento,max(id_media) maxmedia
FROM mediaLinks
GROUP BY id_evento) AS pippo
JOIN MediaCatalogue ON (pippo.maxmedia=MediaCatalogue.id_media)
Codice:
SELECT * FROM Eventi
LEFT OUTER JOIN
(tutta la sbrodolata di prima) AS menata
ON (menata.id_evento = Eventi.id_evento)
Con le funzioni analitiche di SQL-Server 2005+ la cosa e' piu' semplice (ma forse meno leggibile se non ci si e' abituati) PS: Sbrodolata e' un termine tecnico, in uso anche in ambiente sistemistico, dove pero' si tende ad usare solo per i log-file. Qui e' usata impropriamente, in quanto una Query inizia ad essere una sbrodolata quando ci vogliono almeno un paio di pagine per leggerla. A quel punto chi non usa le viste non ha capito molto cosa vuol dire manutenere il codice.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 26-03-2008 alle 11:48. |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Aug 2003
Messaggi: 72
|
Grazie mille per la disponibilità e l'aiuto che mi avete dato
__________________
Visual Basic e dintorni Blog sullo sviluppo web |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:26.




















