【问题标题】:How to join 4 tables to get data from two tables如何连接4个表以从两个表中获取数据
【发布时间】:2021-12-11 09:44:10
【问题描述】:

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

我试过了,但它没有按预期返回结果。

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

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

页表:

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

user_page 表:

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

group_user 表:

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

group_page 表:

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

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

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

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化代码。当你得到一个你不期望的结果时,暂停你的总体目标,切到第一个具有意外结果的子表达式并说出你的期望和原因,并通过文档证明是合理的。 How to AskHelp center

标签: sql join


【解决方案1】:

我会选择这样的东西,对那些 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'

【讨论】:

    【解决方案2】:

    请注意,您的小提琴没有 page_id 4,因此没有返回任何结果。我将 page_id 3 更新为 page_id 4。

    我加入 group_user 和 group_page 以便我可以选择 user_id 和 page_id(组访问),然后从 user_page 表中 UNION 到 user_id 和 page_id(直接访问)。 UNION 应该返回不同的记录。

    然后我将这个结果加入到带有 WHERE user_id = 7 的 pages 表中。

    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
    

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多