Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
DEEBOT T90 PRO OMNI abbina un sistema di aspirazione basato su tecnologia BLAST ad un rullo di lavaggio dei pavimenti dalla larghezza elevata, capace di trattare al meglio le superfici di casa minimizzando i tempi di lavoro. Un robot completo che riesce anche ad essere sottile e garantire automazione ed efficienza nelle operazioni di pulizia di casa
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
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


Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Nothing Phone (4a) disponibile su Amazon...
NemoClaw è la soluzione di NVIDIA...
Abarth Grande Panda ibrida: lo Scorpione...
European Hardware Awards 2026: la data &...
NVIDIA, nel futuro c'è la GPU Fey...
Doom: The Dark Ages è il primo gr...
Robot aspirapolvere ECOVACS in offerta: ...
22.000Pa e si pulisce da solo per 75 gio...
Samsung prepara i nuovi Galaxy Tab S12: ...
Virtual C-Suite: gli agenti IA di Master...
WINDTRE alza i prezzi: nuova rimodulazio...
Resident Evil Requiem non si ferma pi&ug...
Pokémon Go: 30 miliardi di foto u...
Samsung Galaxy Z TriFold è gi&agr...
Accessori auto da non perdere su Amazon:...
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: 12:00.


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