簡體   English   中英

SQL-一對多並獲得所有沒有的用戶

[英]SQL - one-to-many and get all users that don't have

我有用戶和權限表。 它們之間的關系是:

一位用戶有HAS MANY權限。

我需要讓所有沒有權限的用戶都hide

例如,用戶表具有:

 id ¦ name   ¦ email           ¦ password  
 ---+ -------+-----------------+---------- 
  1 ¦ Test 1 ¦ test@gmail.com  ¦ 1234      
  2 ¦ Test 2 ¦ test2@gmail.com ¦ 2345      
  3 ¦ Test 3 ¦ test3@gmail.com ¦ 2345  
  4 ¦ Test 4 ¦ test4@gmail.com ¦ 8888
  5 ¦ Test 5 ¦ test5@gmail.com ¦ 9876  

和權限表如下所示:

   user_id ¦ permission  
  ---------+------------ 
   1       ¦ read        
   2       ¦ edit        
   2       ¦ hide     
   4       ¦ edit   
   5       ¦ hide        

這是我到目前為止嘗試過的:

SELECT * 
FROM users 
  LEFT JOIN permissions 
         ON users.id = permissions.user_id 
        AND permissions.permission != 'hide'

但這仍然讓我成為第二用戶,因為第二用戶也具有權限編輯。

預期結果:

 id ¦ name   ¦ email           ¦ password  ¦ permission 
 ---+ -------+-----------------+---------- +------------
  1 ¦ Test 1 ¦ test@gmail.com  ¦ 1234      ¦ read      
  3 ¦ Test 3 ¦ test3@gmail.com ¦ 2345      ¦ null      
  4 ¦ Test 4 ¦ test4@gmail.com ¦ 8888      ¦ edit         

最好的方法是什么?

not exists好理由

SELECT * 
FROM users u
left JOIN permissions p
  ON u.id = p.user_id 
where not exists ( select 1 
                   from permissions p2
                   where p2.user_id = u.id 
                   and p2.permission = 'hide'
                 )
SELECT * 
FROM users u
left JOIN permissions p
  ON u.id = p.id 
where u.id not in 
( 
  select id
  from permissions
  where permission = 'hide'
  group by id
)

輸出

id  Name    Email   Password        id       permission
1   Test 1  test@gmail.com  1234    1        read
3   Test 3  test3@gmail.com 2345    (null)   (null)

一個可能的答案可能是

select * from Users U
inner join Permissions P on P.id=U.id 
WHere U.id NOT IN (SELECT U.ID FROM  Users U
inner join Permissions P on P.id=U.id 
WHere P.Permission ='HIDE')

1)這將返回具有隱藏權限的ID

SELECT U.ID FROM  Users U
inner join Permissions P on P.id=U.id 
WHere P.Permission ='HIDE'

2)這將返回除上述返回的ID之外的所有數據,這將是您期望的

select * from Users U
inner join Permissions P on P.id=U.id 
WHere  U.id NOT IN (SELECT U.ID FROM  Users U
inner join Permissions P on P.id=U.id 
WHere P.Permission ='HIDE')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM