Visualizzazione risultati 1 fino 2 di 2

Discussione: Estrarre utente con JOINT

  1. #1
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito Estrarre utente con JOINT

    Ciao ragazzzi, una domanda.
    Ho due tabelle così formate:

    TAB 1: utenti

    Nome, Cognome, ora_online

    Tiziano, Ferro, si
    Raul, Bova, si
    Anna, Falchi, no
    Megan, Fox, si

    Ecc

    TAB 2: ruolo

    Nome, Direttore, Funzionario, Impiegato

    Tiziano, 1,0,0
    Raul,0,1,0
    Anna,0,0,1

    Se io volessi estrarre tutti gli utenti che ricoprono un ruolo da direttore, funzionario e impiegato attualmente connessi della tabella 1 (dunque solo Tiziano e Raul, escludendo Megan perché, ancorché connessa, non ha nessun ruolo), quale sarebbe la sintassi?

    Una left join?

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Piuttosto una JOIN con una condizione:
    Codice:
    SELECT * FROM utenti JOIN ruolo ON utenti.Nome = ruolo.Nome WHERE ora_connessi = 1;
    Non basare, però, la JOIN sui nomi, altrimenti appena due utenti hanno lo stesso nome ottieni risultati sbagliati. Basati su una chiave primaria, fosse anche surrogata.
    Cerca anche di usare una nomenclatura più consistente: hai una tabella utenti al plurale, e una ruolo al singolare, le tabelle sono lowercase mentre i nomi dei campi iniziano con la maiuscola, tranne ora_online che usa uno snake_case: prova a utilizzare un unico criterio per i nomi.
    Infine, ma questo dipende dalle specifiche, sembra che lo schema non sia in forma normale, hai la tabella ruolo con un gruppo di colonne delle quali una sola deve valere 1, tutte le altre 0. Sembra che la relazione tra utente e ruolo sia 1:n, dunque perché non rappresentarla in questo modo?
    Codice:
    utente: id, nome, congnome, ora_online, id_ruolo
    1, Tiziano, Ferro,  1, 1
    2, Raul,    Bova,   1, 2
    3, Anna,    Falchi, 0, 3
    4, Megan,   Fox,    1, NULL
    
    ruolo: id, nome
    1, direttore
    2, funzionario
    3, impiegato
    La query di cui hai bisogno diventa quindi:
    Codice:
    SELECT * FROM utente LEFT JOIN ruolo ON utente.id_ruolo = ruolo.id WHERE utente.ora_online = 1
    Con questo approccio hai il vantaggio di mantenere uno schema flessibile, se un domani dovessi prevedere nuovi ruoli ti basterebbe un'INSERT anziché andare a cambiare la struttura di una tabella.
    Se è possibile che un utente possa ricoprire più di un ruolo dovrai aggiungere un'ulteriore tabella utente_ruolo: id_utente, id_ruolo.

    I suggerimenti che do più spesso:


Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •