Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-08-2012, 13:32   #1
zanardi84
Senior Member
 
L'Avatar di zanardi84
 
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5751
[SQL] Una query mySQL che non funge

Ho queste due relazioni:

musei(ID_museo, nome, città, numero_sale, nazione)

quadri(ID_quadro, titolo, periodo, autore, id_museo)

in cui ho evidenziato in grassetto la chiave primaria e in corsivo quella esterna.

Ho una query da risolvere che dice di trovare quali musei hanno un numero di quadri superiore alla media complessiva per quella nazione.

Questo è il mio codice che coincide con quello della soluzione, ma non funziona.

Codice:
SELECT nome,COUNT(*) as tot
FROM Musei M INNER JOIN Quadri Q
ON Q.id_museo=M.ID_museo
GROUP BY M.ID_museo
HAVING tot >
  (
  (SELECT COUNT(*) 
   FROM Quadri
   WHERE Quadri.id_museo=M.ID_museo)
  /
  (SELECT COUNT(*) 
   FROM Quadri
   WHERE Quadri.id_museo=M.ID_museo
   GROUP BY M.nazione)
  )
mysql mi dice che è sconosciuto l'attributo M.nazione nel raggruppamento.

Sapreste indicarmi anche una strategia per risolvere le query annidate molto complesse?

Per quanto riguarda l'uso delle variabili mi potreste chiarire quando è opportuno inserirle nei casi di query annidate?

Grazie.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti.

Ultima modifica di zanardi84 : 17-08-2012 alle 16:58.
zanardi84 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2012, 14:24   #2
Dânêl
Senior Member
 
Iscritto dal: Jul 2008
Messaggi: 485
Nelle due relazioni che hai riportato non esiste alcun attributo nazione, quindi è normale che tu ottenga quell'errore. Se non ci sono altri problemi (non ho provato la query) ti basta sostituire nazione con città, l'unico attributo che gli si avvicina concettualmente.

Forse si tratta di un refuso nella traccia/tabella o, in alternativa, dovrebbe esistere una terza relazione, o un semplice attributo aggiuntivo, che associa ciascuna città ad una nazione
Dânêl è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2012, 14:26   #3
Ashgan83
Senior Member
 
L'Avatar di Ashgan83
 
Iscritto dal: Nov 2004
Messaggi: 1747
Quote:
Originariamente inviato da zanardi84 Guarda i messaggi
Ho queste due relazioni:

musei(ID_museo, nome, città, numero_sale, nazioni)

quadri(ID_quadro, titolo, periodo, autore, id_museo)

in cui ho evidenziato in grassetto la chiave primaria e in corsivo quella esterna.

Ho una query da risolvere che dice di trovare quali musei hanno un numero di quadri superiore alla media complessiva per quella nazione.

Questo è il mio codice che coincide con quello della soluzione, ma non funziona.

Codice:
SELECT nome,COUNT(*) as tot
FROM Musei M INNER JOIN Quadri Q
ON Q.id_museo=M.ID_museo
GROUP BY M.ID_museo
HAVING tot >
  (
  (SELECT COUNT(*) 
   FROM Quadri
   WHERE Quadri.id_museo=M.ID_museo)
  /
  (SELECT COUNT(*) 
   FROM Quadri
   WHERE Quadri.id_museo=M.ID_museo
   GROUP BY M.nazione)
  )
mysql mi dice che è sconosciuto l'attributo M.nazione nel raggruppamento.

Sapreste indicarmi anche una strategia per risolvere le query annidate molto complesse?

Per quanto riguarda l'uso delle variabili mi potreste chiarire quando è opportuno inserirle nei casi di query annidate?

Grazie.


Scusa ma non l'hai chiamato "nazioni" nella tabella? Nella query usi "M.nazione".
__________________
Esistono 10 tipi di persone al mondo: quelli che capiscono il codice binario e quelli che non lo capiscono
Ashgan83 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2012, 16:58   #4
zanardi84
Senior Member
 
L'Avatar di zanardi84
 
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5751
Chiedo scusa, è nazione, non nazioni. Correggo anche nel thread iniziale.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti.
zanardi84 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2012, 17:06   #5
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da zanardi84 Guarda i messaggi
Codice:
  (SELECT COUNT(*) 
   FROM Quadri
   WHERE Quadri.id_museo=M.ID_museo
   GROUP BY M.nazione)
  )
mysql mi dice che è sconosciuto l'attributo M.nazione nel raggruppamento.
Mi sembra una query molto "creativa" nel suo complesso, ma questa particolare annidata mi lascia perplesso...
Fai un select del conteggio dei quadri raggruppati secondo un attributo che appartiene a un'altra tabella... secondo me l'errore sta in questo... prova a controllare.

ps: per quanto riguarda lo stile, ti consiglio: tutto in minuscolo (ID_museo -> id_museo), e il nome dei campi del tipo "id_xxxx" usarli solo per gli id usati come chiavi primarie. Per esempio nella tabella quadri, avrei messo "museo" e non "id_museo", in quanto quell'attributo è si l'id del museo, ma rappresenta l'intero museo.
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 17-08-2012 alle 17:22.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 18-08-2012, 12:38   #6
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quando scrivi

Having tot> (bla bla)

oppure anche quando scrivi

Where qualcosa > (bla bla)

dove quel blabla vuoi che sia una sottoquery, allora questa sottoquery deve restituire uno scalare.

Ovvero nel tuo caso devi far restituire la media dei quadri della nazione del record che stai processando sulla riga master
La Join non la devi fare per museo, ma per nazione.
E ho idea che non ci sara' nessuna GROUP BY
__________________
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 : 18-08-2012 alle 12:41.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 18-08-2012, 15:36   #7
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
supponendo che le relazioni siano (ho apportato qualche modifica):
Codice:
musei(id_museo, nome, città, numero_sale, nazione)
quadri(id_quadro, titolo, periodo, autore, museo)
questa query dovrebbe funzionare:
Codice:
SELECT y.museo, x.nazione, x.medianaz, y.nqm  FROM (
  SELECT a.nazione, nqn, nmn, nqn/nmn AS medianaz FROM 
    ( SELECT nazione, COUNT(*) AS nqn FROM musei JOIN quadri ON id_museo = museo GROUP BY nazione ) a 
  JOIN
    ( SELECT nazione, COUNT(*) AS nmn FROM musei GROUP BY nazione) b
  ON a.nazione = b.nazione ) x
JOIN (
  SELECT nazione, museo, COUNT(*) AS nqm FROM musei JOIN quadri ON id_museo = museo GROUP BY museo ) y
ON x.nazione = y.nazione
WHERE y.nqm > x.medianaz
ho poca fantasia, e gli alias a,b,x,y ne sono la conseguenza, ovviamente mettici quello che ti pare
nqn = numero quadri nazione
nmn = numero musei nazione
nqm = numero quadri museo
medianaz = media nazionale di quadri per museo

la relazione a conta i quadri per nazione, la relazione b conta il numero di musei per nazione. x è il join di a con b e l'attributo x.medianaz è il rapporto nqn/nmn. x è joinato a y che conta il numero di quadri per ogni museo, dal join x*y tengo solo le tuple in cui nqm > medianaz.

Provato in locale e mi pare che funzioni

ps: non escludo l'esistenza di soluzioni più eleganti con l'uso di funzioni SQL, questa mi è venuta in mente così... e mi sa che esiste più di un modo di scrivere la stessa query che ho scritto sopra.
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 18-08-2012 alle 15:41.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2012, 11:31   #8
zanardi84
Senior Member
 
L'Avatar di zanardi84
 
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5751
Quando dovete formulare una query quali sono i ragionamenti che fate?
Cosa vi fa optare per una subquery?
Quando usare il self join?

Alla fine conosco la sintassi e le definizioni degli operatori, ma non riesco a formulare efficaci interrogazioni.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti.
zanardi84 è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2012, 13:48   #9
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da zanardi84 Guarda i messaggi
Quando dovete formulare una query quali sono i ragionamenti che fate?
Cosa vi fa optare per una subquery?
Quando usare il self join?

Alla fine conosco la sintassi e le definizioni degli operatori, ma non riesco a formulare efficaci interrogazioni.
Quello che cerchi si studia nella teoria dell'algebra relazionale, ma fondamentalmente non è nulla di così arcano e la vera tecnica si sviluppa col tempo facendo pratica. Comunque già il fatto di renderti conto che l'algebra relazione così come l'SQL hanno molte analogie con il calcolo insiemistico (il join è di fatto un prodotto cartesiano fra gli insiemi che sono le tabelle, è possibile lavorare su interesezioni, unioni, raggruppamenti...) ti permette di capire come usare le interrogazioni.
Non c'e' una regola che ti dice quando usare una sottoquery o un selfjoin, lì sul momento vedi che ti serve... e spesso esistono più strade per raggiungere lo stesso risultato
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2012, 08:26   #10
yuri.f_87
Member
 
L'Avatar di yuri.f_87
 
Iscritto dal: Nov 2007
Messaggi: 143
Ciao, di seguito trovi una delle tante soluzioni possibili.
Codice:
declare @t table (	IdMuseo	int,	
	              Nazione	varchar(50),
		NumQuadMuseo	int
	  )
declare @t2 table ( Nazione varchar(50), 		
               	  AVGQuadNazione	decimal(18,2)
		)
				
insert @t (	IdMuseo ,	
		Nazione	,
		NumQuadMuseo
	)
select	M.ID_museo, 
	M.nazione, 
	COUNT(*) as QuadriMuseo
from	@musei M
	inner join @quadri Q on M.ID_museo = Q.id_museo
group by M.ID_museo, M.nazione

insert into @t2 (	Nazione,
		AVGQuadNazione
	)
select	T.nazione, AVG(convert(decimal(18,2), T.NumQuadMuseo))
from	@t T
group by T.nazione

select	*
from	@t T
where	T.NumQuadMuseo >= (	select	T2.AVGQuadNazione
				from	@t2 T2
				where	T2.nazione = T.nazione
			)
order by T.IdMuseo
Di certo non è la soluzione più veloce (si potrebbe abbastanza facilmente eliminare le tab temporanee), ma secondo me è abbastanza lineare scritta in questo modo.
Ciao,
Yuri.
yuri.f_87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La prima missione orbitale del razzo spa...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:40.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v