如何连接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
我正在尝试 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.
将这个结果加入页面 tablehttps://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