Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-08-2012, 14:32   #1
zanardi84
Senior Member
 
L'Avatar di zanardi84
 
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5749
[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 17:58.
zanardi84 è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2012, 15: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, 15: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, 17:58   #4
zanardi84
Senior Member
 
L'Avatar di zanardi84
 
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5749
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, 18: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 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 17-08-2012 alle 18:22.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 18-08-2012, 13: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 13:41.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 18-08-2012, 16: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 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 18-08-2012 alle 16:41.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2012, 12:31   #8
zanardi84
Senior Member
 
L'Avatar di zanardi84
 
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5749
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, 14: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 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2012, 09: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


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Chiamate cristalline e ANC evoluto a pre...
Adobe aggiorna Premiere e After Effects:...
AI Bundle, la novità dei driver A...
La roadster elettrica supportata da Xiao...
Netflix rivede l'offerta per Warner Bros...
Satya Nadella avverte: senza benefici co...
Anche secondo Andy Jassy, CEO di Amazon,...
Audi mostra la sua prima auto di Formula...
Evolve3 85 e 75: Jabra presenta le prime...
KIOXIA: 'il tempo degli SSD a basso cost...
Apple perde la sua posizione privilegiat...
CovertLabs lancia l'allarme: 198 app AI ...
Smart TV QLED da 75 pollici a 559€ su Am...
Nello Spazio l'evoluzione cambia rotta: ...
Il fondatore di Waymo critica l'FSD di T...
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: 15:59.


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