Domanda

C'è un modo per interrogare tabella utenti in questo modo:

| id | username |
-----------------
| 1  | user1    |
| 2  | user2    |
| 3  | user3    |

e la tabella user_roles:

| id_user | id_role |
---------------------
|    1    |    1    |
|    1    |    2    |
|    1    |    3    |
|    2    |    2    |
|    3    |    1    |

assumendo quel ruolo con id = 1 è un ruolo di amministratore, per produrre risultati che assomiglia a questo:

| id | username | admin |
-------------------------
| 1  | user1    |   Y   |
| 2  | user2    |   N   |
| 3  | user3    |   Y   |

Credo che può essere fatto utilizzando le istruzioni SELECT nidificate, ma mi chiedevo se è fattibile utilizzando JOIN.

Modifica: Il valore della colonna di amministrazione non deve essere Y o N, può essere amministratore ruolo id (1) o NULL o qualsiasi altra cosa che mi permetta di sapere se l'utente è un amministratore

È stato utile?

Soluzione

Vorrei provare questo:

select u.id, u.username, if (id_role is null,  'N', 'Y') as is_admin
  from users u
  left outer join user_roles r
    on u.id = r.id_user and r.id_role = 1

Ma io non sono sicuro al 100%.

Altri suggerimenti

Bene, è possibile unire in questo modo, che vi darà la id_role nel risultato.

SELECT u.*, r.id_role
FROM users u
LEFT JOIN user_roles r
ON u.id=r.id_user

È possibile aggiungere WHERE r.id_role=1 per ottenere solo gli amministratori, ecc.

Ma per ottenere l'admin come "Y" o "N" come si voleva, è possibile utilizzare un IF se l'id_role è 1 o meno.

SELECT u.*, IF(r.id_role = 1, "Y", "N") as admin
FROM users u
LEFT JOIN user_roles r
ON u.id=r.id_user
select u.id_user, if(count(1) > 0, 'Y', 'N')
from user u left outer join user_roles ur on u.user_id = ur.user_roles
where ur.id_role=1
group by u.id_user

Non sto usando mysql, quindi basta googled ha il 'se' la funzione, se questo è sbagliato, sostituirlo con DECODE, COALESCE o simili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top