Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [mysql] join su piu tabelle

    Buonasera a tutti,

    Io ho 5 tabelle cosi strutturate e popolate:

    tabella CDC
    ----------------------------------------------------------------------
    idcdc - cdc - descrizione
    ------------------------------------------------------------------------
    1 - DTDT – direzione blablabla
    2 - DTLL - direzione pepepe
    ------------------------------------------------------------------------

    tabella CORSI
    ----------------------------------------------------------------------
    id - idtipocorso - nomecorso - note - dataesame - scadenza
    ------------------------------------------------------------------------
    1 - 1 - 4° Corso lavoratori – prova – 2013-03-06 - 2015-03-06
    2 - 1 - 16° Corso lavoratori - prova - 2015-02-08 - 2017-02-08
    3 - 1 - 1° corso sfaticati – prova - 2014-05-14- 2016-05-14
    ------------------------------------------------------------------------

    tabella FREQUENZE
    ----------------------------------------------------------------------
    idfrequenza - idutente - idcorso
    ------------------------------------------------------------------------
    1 - 1 - 1
    2 - 1 - 2
    3 - 1 - 3


    tabella TIPOCORSI
    ----------------------------------------------------------------------
    idcorso - descrizione - validita
    ------------------------------------------------------------------------
    1 - Lavoratori – 24
    2 - sfaticati - 24
    ------------------------------------------------------------------------

    tabella UTENTI
    ----------------------------------------------------------------------
    iduser - idcdc - cognome - nome
    ------------------------------------------------------------------------
    1 - 1 – Pippo- Pluto
    2 - 2 – Rrrrr- Ssssss
    ------------------------------------------------------------------------

    Applico la query:

    SELECT Utenti.Cognome, Utenti.Nome, corsi.nomecorso, corsi.scadenza,
    tipocorsi.validita, tipocorsi.idcorso, cdC.cdc
    FROM utenti
    INNER JOIN cdc
    ON cdc.idcdc = utenti.idcdc
    INNER JOIN frequenze
    ON frequenze.idutente = Utenti.iduser
    INNER JOIN corsi
    ON frequenze.idcorso=Corsi.id
    INNER JOIN tipocorsi
    ON tipocorsi.idcorso=corsi.idtipocorso
    WHERE UTENTI.iduser=1

    il resultset è:

    ----------------------------------------------------------------------

    cognome - nome - nomecorso - scadenza - validita – idcorso - cdc

    ------------------------------------------------------------------------
    Pippo - Pluto - 4° Corso lavoratori – ‘2015-03-06’ - 24 – 1 - DTDT

    Pippo - Pluto - 16° Corso lavoratori – ‘2017-02-08’- 24 – 1 - DTDT

    Pippo - Pluto - 1° corso sfaticati – ‘2016-05-14’- 24 – 2 - DTDT
    ------------------------------------------------------------------------


    Ma se io a parità di "idcorso " vorrei che mi fosse restituito solo quello con la data di scadenza + alta come posso fare?

    nel caso specifico vorrei che il risultato fosse:

    ----------------------------------------------------------------------

    cognome - nome - nomecorso - scadenza - validita – idcorso - cdc

    ------------------------------------------------------------------------
    Pippo - Pluto - 16° Corso lavoratori – ‘2017-02-08’- 24 – 1 - DTDT

    Pippo - Pluto - 1° corso sfaticati – ‘2016-05-14’- 24 – 2 - DTDT
    ------------------------------------------------------------------------

    Ho provato con un "max(corsi.scadenza)" ma non va..
    lo stesso con "group by corsi.idtipocorso"

    in pratica con max mi da si solo il valore più alto di data ma come nomecorso quello del più vecchio.

    Qualcuno a qualche consiglio?

    Vi ringrazio si da ora per qualsiasi suggerimento.

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    539
    .
    Ultima modifica di marino51; 26-02-2015 a 10:30

  3. #3
    Ciao,
    innanzitutto grazie per la risposta, ho provato cosi come mi avevi prima indicato, ti riscrivo la query. Il risultato è pero sempre lo stesso, mi compaiono sempre le stesse tre righe. Se invece raggruppo per a.idcorso, stesso problema di prima, mi da si solo il valore più alto di data ma come nomecorso quello del più vecchio

    SELECT a.cognome,a.nome,a.nomecorso,max(a.scadenza),
    a.validita,a.idcorso,a.cdc
    FROM (
    SELECT utenti.grado, Utenti.Cognome, Utenti.Nome, corsi.nomecorso, corsi.scadenza,
    tipocorsi.validita,
    tipocorsi.idcorso, cdC.cdc
    FROM utenti
    INNER JOIN cdc
    ON cdc.idcdc = utenti.idcdc

    INNER JOIN frequenze
    ON frequenze.idutente = Utenti.iduser

    INNER JOIN corsi
    ON frequenze.idcorso=Corsi.id

    INNER JOIN tipocorsi
    ON tipocorsi.idcorso=corsi.idtipocorso

    WHERE UTENTI.iduser=1

    ) a
    GROUP by a.cognome,a.nome,a.nomecorso,a.validita,a.idcorso, a.cdc

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    539
    si, scusa, non avevo considerato che la descrizione del corso è diversa ( 4° .... 16° .... ),
    pur essendo lo stesso corso, cambia l'edizione

    però puoi fare una select della max(data) raggruppando per IDcorso
    poi usi questi elementi per recuperare le altre informazioni
    "incrociando" due select (+join) nella stessa query

  5. #5
    Quote Originariamente inviata da marino51 Visualizza il messaggio
    si, scusa, non avevo considerato che la descrizione del corso è diversa ( 4° .... 16° .... ),
    pur essendo lo stesso corso, cambia l'edizione

    però puoi fare una select della max(data) raggruppando per IDcorso
    poi usi questi elementi per recuperare le altre informazioni
    "incrociando" due select (+join) nella stessa query

    Grazie del suggerimento, non credo di aver capito bene come intendi. Ci provo

  6. #6
    Marino,

    Potresti per cortesia spiegarmi meglio la tua idea? Ho provato a rifare la query ma non riesco. Potresti per cortesia farmi un esempio?

    Grazie.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    539
    nella query, da fastidio il "corsi.nomecorso",
    prova ad eliminarlo completamente dalla query che ti ho postato
    e dimmi se il risultato è in linea con quanto ti aspetti
    in caso di risultato positivo, aggiungiamo dopo l'elemento che abbiamo tolto

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.