Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Domanda su una query

    Io ho una tabella di questo tipo:

    codice:
    nome       nascita  citta
    ----------------------------
    franco     1985     como
    giacomo    1955     milano
    luca       1995     genova
    giorgio    1945     torino
    davide     1968     genova
    paolo      1984     milano
    domenico   1997     milano
    vittorio   1938     roma
    stefania   1986     como
    sara       1977     genova
    filippo    1966     palermo
    Ora vorrei eseguire la seguente richiesta:
    "Per ogni città, indicare il nome della persona più giovane" ed ottenere questo:

    codice:
    citta      nome
    --------------------
    como       stefania
    milano     domenico
    genova     luca
    torino     giorgio
    roma       vittorio
    palermo    filippo
    Ho fatto un po' di prove, ma non riesco a scrivere la query SQL giusta ed arrivare a questo risultato. Immagino di dover utilizzare GROUP BY, ma probabilmente sbaglio da qualche parte.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    codice:
    select t1.citta,t1.nome from tabella as t1
    inner join (select * from tabella order by nascita desc) as t2 on t1.id = t2.id
    group by t1.citta
    In futuro ricorda di indicare nel titolo della discussione il database che usi.

  3. #3
    Prima di tutto chiedo scusa per non aver inserito il titpo di database, in questo caso SQL.

    La query che mi hai suggerito mi da il seguente errore:
    codice:
    Unknown column 't1.id' in 'on clause'
    Inoltre contiene alcune parole chiave che non conosco: inner join e on.
    Sto studiando SQL per l'università e queste parole non le abbiamo ancora incontrate, è possibile risolvere il problema senza di esse?

    Inizialmente avevo provato questo:
    codice:
    SELECT citta, nome
    FROM tabella
    WHERE nascita >= ALL (SELECT nascita
                          FROM tabella)
    GROUP BY citta
    Che ora mi rendo conto essere piuttosto sbagliato.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    SQL è il linguaggio di interrogazione. Nel titolo devi indicare il database utilizzato (mysql, mssql, oracle, etc) visto che la sintassi spesso differisce.

    Tornando al tuo problema, avevo dato per scontato che avessi incluso un campo identificatore nella tabella.

    La query diventa così

    codice:
    select t1.citta,t1.nome from tabella as t1
    inner join (select * from tabella order by nascita desc) as t2 
    on t1.nascita = t2.nascita
    group by t1.citta
    Oppure così:

    codice:
    select tab2.citta,tab2.nome
    from
    (select max(nascita) as minore from tabella
    group by citta) as tab1
    left join tabella as tab2 on tab1.minore = tab2.nascita
    anche se la prima, in termini di prestazioni su tabelle di grandi dimensioni, è preferibile.

  5. #5
    SQL è il linguaggio di interrogazione. Nel titolo devi indicare il database utilizzato (mysql, mssql, oracle, etc) visto che la sintassi spesso differisce.
    Io sto utilizzando mysql. Purtroppo non posso modificare il nome del topic, me lo ricorderò per la prossima volta.

    Effettivamente adesso i due script che mi hai proposto non danno più errori, ma nel secondo deve esserci qualcosa di sbagliato: non fa quello che dovrebbe, non sempre mi da il nome della persona più giovane della città. Il primo invece è perfetto.

    Però ho una richiesta: è possibile sistemare il primo script in modo che non utilizzi la parola JOIN? A lezione non l'abbiamo ancora vista e quindi non la posso usare (e non ho capito esattamente cosa fa).
    Comunque mi stai dando un grosso aiuto, finalmente ho uno script funzionante, sono giorni che ci sbatto la testa

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Un'altra alternativa potrebbe essere questa allora:

    codice:
    select tab1.citta,tab1.nome
    from tabella as tab1
    where tab1.nascita = (select max(nascita) from tabella as tab2 where tab1.citta = tab2.citta)
    Provo a vedere la seconda query che ti avevo scritto e che mi hai detto non funziona a dovere.

  7. #7
    codice:
    SELECT DISTINCT citta, nome FROM spada T1 WHERE nascita=(SELECT MAX(nascita) FROM spada WHERE citta=T1.citta)
    studia!

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da optime
    codice:
    SELECT DISTINCT citta, nome FROM spada T1 WHERE nascita=(SELECT MAX(nascita) FROM spada WHERE citta=T1.citta)
    studia!


    Altra alternativa:

    codice:
    select tab1.citta,tab1.nome
    from tabella as tab1,
    	(select citta,max(nascita) as giovane
    	 from tabella
    	 group by citta) as tab2
    where tab1.citta = tab2.citta and tab1.nascita = tab2.giovane
    Come vedi le possibilità non mancano.

  9. #9
    Le penultime due che avete postato sono perfette! (il DISTINCT in quella di optime è superfluo)
    Era esattamente quello a cui volevo arrivare, solo non sapevo che nella query più interna si potesse riferirsi ad un elemento di quella esterna! Non sapevo più cosa inventarmi.
    codice:
    SELECT citta, nome  
    FROM tabella t1  
    WHERE nascita = (SELECT MAX(nascita)
                     FROM tabella
                     WHERE citta = T1.citta)
    Era semplicissima!
    Grazie mille a tutti e due e sì, studierò

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Giusto per completezza del thread la query che in effetti generava risultati sballati andava riscritta così

    codice:
    select tab2.citta,tab2.nome
    from
    (select citta,max(nascita) as nascita from tabella
    group by citta) as tab1
    left join tabella as tab2 on tab1.nascita = tab2.nascita and tab1.citta = tab2.citta
    visto che il massimo anno relativo a una persona poteva coincidere con lo stesso anno di un'altra che invece non era la più giovane della città. Ora mi sembra si comporti come dovrebbe.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.