Переписать подзапрос (не в) как присоединиться

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

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

как присоединиться?

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

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       |       |  
+--------+---------+------+-----+---------+-------+  
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
1 938
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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;

OP хочет переписать подзапрос как соединение, но в этом запросе все еще есть подзапрос.

Raptor 08.11.2012 06:37

@ShivanRaptor: (а) OP не указал подзапрос, просто «могу ли я переписать как соединение»; (b) OP принял мой ответ, так что, по-видимому, доволен им; (в) все это произошло почти 4 года назад! ;-)

Tony Andrews 08.11.2012 14:52

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

select userid from User
where not exists 
  (select UserId from UserRole
     where UserRole.userid = User.userid and roleid not in(8) )

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

Т.е.

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

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

Примечание: MySQL НЕ поддерживает EXCEPT.

Raptor 08.11.2012 06:35

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

select userID from user 
left join UserRole 
on user.userID = UserRole.userID 
and UserRole.roleID = 8
where UserRole.roleID IS NULL

Примечание: можно использовать псевдоним таблицы

Raptor 08.11.2012 06:36

Другие вопросы по теме