Переписать подзапрос (не в) как Join - PullRequest
0 голосов
/ 05 января 2009

Привет всем, можно ли переписать запрос:

select userid from User where userid not in(select userid from UserRole where roleid in(8));

as Join?

проблема в том, что один пользователь может иметь несколько ролей
заранее спасибо.

mysql> desc User;  
+--------------------+-------------------+------+-----+---------+----------------+  
| Field              | Type              | Null | Key | Default | Extra          |  
+--------------------+-------------------+------+-----+---------+----------------+  
| userId             | int(11)           | NO   | PRI | NULL    | auto_increment |  
| userName           | varchar(50)       | YES  |     | NULL    |                |  

... и другие столбцы, связанные с пользователем

mysql> desc UserRole;  
+--------+---------+------+-----+---------+-------+  
| Field  | Type    | Null | Key | Default | Extra |  
+--------+---------+------+-----+---------+-------+  
| userId | int(11) | NO   | PRI | 0       |       |  
| roleId | int(11) | NO   | PRI | 0       |       |  
+--------+---------+------+-----+---------+-------+  

Ответы [ 4 ]

1 голос
/ 05 января 2009

Я не проверял это, но я думаю, что это работает.

select userID from user 
left join UserRole 
on user.userID = UserRole.userID 
and UserRole.roleID = 8
where UserRole.roleID IS NULL
0 голосов
/ 05 января 2009

Я думаю, что это должно дать вам всех, кто имеет Роль, отличную от 8

select userid from User
where not exists 
  (select UserId from UserRole
     where UserRole.userid = User.userid and roleid not in(8) )
0 голосов
/ 05 января 2009

Если вы хотите улучшить читабельность, вы можете использовать предложение EXCEPT.

* 1003 Т.е. *

select userId from user 
except
select userId from UserRole where roleId <> 8

Не уверен, что MySQL поддерживает "Except".

0 голосов
/ 05 января 2009

Может это сработает?

select userid from User 
left outer join
(select userid, roleid from UserRole where roleid in(8)) v
on User.userid = v.userid
where roleid is null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...