如何连接4个表以从两个表中获取数据

How to join 4 tables to get data from two tables

我正在尝试 select 此用户有权访问的所有页面,无论是直接访问还是群组访问。

我试过了,但没有return预期的结果。

SELECT DISTINCT  
    pages.id AS page_id, 
    pages.name AS page_name, 
    pages.description AS page_description,
    pages.type AS page_type, 
    group_page.group_id AS page_group_id, 
    user_page.user_id AS page_user_id 
FROM 
    pages 
JOIN
    user_page ON pages.id = user_page.page_id 
JOIN 
    group_page ON pages.id = group_page.page_id 
JOIN 
    user_group ON group_page.group_id = user_group_.group_id 
WHERE 
    user_page.user_id =  23

我在下面的架构中提供了示例数据:

第table页:

page_id  | page_name | page_description
---------+-----------+------------------
4        |  name3    | descr 
6        |  name2    | description
5        |  name8    | description

user_page table:

    user_id | page_id
------------+----------
    23      |   4
    12      |   6
    12      |   6

group_user table:

 user_id   | group_id
-----------+-----------
    4      |   14
    4      |   16
    23     |   16
   

group_page table:

 page_id   | group_id
-----------+-----------
    4      |   14
    6      |   16

在这里查看 https://www.db-fiddle.com/f/6MnsujPF8foREq2Cwt8EDn/2

我正在尝试为用户 7 检索第 4 页

我会做这样的事情,在那些 DISTINCT 子句上放轻松,它们通常是不好的做法。这在链接页面的测试中效果很好

select 
p.*
from pages p
inner join group_page gp on gp.page_id=p.page_id
inner join group_user gu on gu.group_id=gp.group_id
where gu.user_id = '7'
union
select 
    p.*
from 
    pages p
inner join
    user_page up ON p.page_id = up.page_id
where up.user_id = '7'

请注意,您的 fiddle 没有 page_id 4,因此 return 没有结果。我将 page_id 3 更新为 page_id 4.

我加入 group_user 和 group_page 这样我就可以 select user_id 和 page_id (组访问),然后 UNION 到user_id 和 page_id 来自 user_page table(直接访问)。 UNION 应该 return 不同的记录。

然后我用 WHERE user_id = 7.

将这个结果加入页面 table

https://www.db-fiddle.com/f/3vqKF2amyFcPvzaFP8hD68/1

select p.*
from pages p
join (

  select up.user_id, up.page_id
  from user_page up
  
  UNION
  
  select gu.user_id, gp.page_id
  from group_user gu
  join group_page gp on (gu.group_id = gp.group_id)
  
) ids on (p.page_id = ids.page_id)
where ids.user_id = 7