I want to check for all connections between two table exists and return all rows specifying weather the connections exists or not for example here is my tables:
Permissions:
| index | Controller | Action |
|---|---|---|
| 5 | Error | index |
| 2 | Home | index |
| 3 | Home | login |
| 4 | Home | logout |
| 1 | Test | index |
| 9 | UserManagement | createUser |
| 8 | UserManagement | editUser |
| 6 | UserManagement | index |
Roles_Permissions:
| Roles | Permissions |
|---|---|
| 1 | 2 |
| 1 | 3 |
| 1 | 5 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 2 | 4 |
| 2 | 5 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 3 | 4 |
| 3 | 5 |
| 4 | 1 |
| 4 | 2 |
| 4 | 3 |
| 4 | 4 |
| 4 | 5 |
| 4 | 6 |
| 4 | 8 |
| 4 | 9 |
Roles:
| Role_id | Role_name |
|---|---|
| 4 | Admin |
| 2 | special |
| 3 | User |
| 1 | Visitor |
if the query variable is Special I want following rows returned:
| index | Controller | Action | Exist |
|---|---|---|---|
| 5 | Error | index | yes |
| 2 | Home | index | yes |
| 3 | Home | login | yes |
| 4 | Home | logout | yes |
| 1 | Test | index | yes |
| 9 | UserManagement | createUser | no |
| 8 | UserManagement | editUser | no |
| 6 | UserManagement | index | no |
Foreign key exists between role_id and perm_id
Advertisement
Answer
I suppose you need something like this
SET @role_name = 'special';
SELECT
p.*,
IF(ISNULL(rp.role_id), 'no', 'yes') AS exist
FROM permissions p
LEFT JOIN roles_permissions rp ON rp.permission_id = p.id AND rp.role_id = (
SELECT role_id FROM roles WHERE role_name = @role_name
)
Output
| id | controller | action | exist |
|---|---|---|---|
| 5 | Error | index | yes |
| 2 | Home | index | yes |
| 3 | Home | login | yes |
| 4 | Home | logout | yes |
| 1 | Test | index | yes |
| 9 | UserManagement | createUser | no |
| 8 | UserManagement | editUser | no |
| 6 | UserManagement | index | no |
You can check a working demo here