Let's say I have two tables like below:
users table:
user_id | name |
---|---|
0 | kevin |
1 | alice |
2 | jake |
3 | mike |
permissions table:
user_id | permission |
---|---|
1 | 12 |
1 | 5 |
3 | 1 |
And let's say that I want to add permission 5 to every single user who doesn't already have it. What would be the best MySQL query for this?
CodePudding user response:
Your question is not 100% clear whether you only need a query or you want to do inserts. Anyway, this query with NOT EXISTS
can be used as base for all necessary actions:
SELECT user_id, 5 AS permission
FROM users u
WHERE NOT EXISTS
(SELECT 1 FROM permissions
WHERE permission = 5 AND user_id = u.user_id);
This will list all user id's that haven't yet a permission 5 and as second column, just 5 will be selected as permission.
Then this result can be used for whatever it should be used. For example to add this outcome in a query to the already present entries, UNION ALL
can be used:
SELECT user_id, 5 AS permission
FROM users u
WHERE NOT EXISTS
(SELECT 1 FROM permissions
WHERE permission = 5 AND user_id = u.user_id)
UNION ALL
SELECT user_id, permission
FROM permissions
ORDER BY user_id, permission;
If - and I think this is your real question - the result of the NOT EXISTS
query should be inserted into the permissions table, this insert command will do this:
INSERT INTO permissions
(SELECT user_id, 5
FROM users u
WHERE NOT EXISTS
(SELECT 1
FROM permissions
WHERE permission = 5 AND user_id = u.user_id));
You can try out these things here: db<>fiddle
CodePudding user response:
you means add permission 5 to every single user this users in permission tables!