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.