【问题标题】:Issues with understanding multiple joins理解多个连接的问题
【发布时间】:2018-01-12 18:59:46
【问题描述】:

我有以下表格:

users
 ____________
| id         |
| first_name |
|____________|

pre_task_plans
 ____________
| id         |
| creator_id | (fk user_id)
|____________|

pre_task_plan_users
 __________________
| id               |
| user_id          |
| pre_task_plan_id |
|__________________|

我正在尝试让所有用户参与我是 (users.id 1) 的创建者的 pre_task_plans

我有

SELECT users.*
FROM users
JOIN pre_task_plans as ptp on ptp.creator_id = 1
JOIN pre_task_plan_users as ptpu on ptpu.pre_task_plan_id = ptp.id

但是返回的用户不在与我的 pre_task_plans 相关的 pre_task_plan_users 中。关于 2nd JOIN 的工作原理,我有什么不明白的地方?

PSQL 9.6.2

【问题讨论】:

    标签: sql postgresql rails-postgresql


    【解决方案1】:
    SELECT users.*, other.*
    FROM users
    JOIN pre_task_plans as ptp on ptp.creator_id = users.id
    JOIN pre_task_plan_users as ptpu on ptpu.pre_task_plan_id = ptp.id
    join users as other on pre_task_plan_users.user_id = other.id
    where users.id = 1
    

    您将每个pre_task_plan 加入它创建的user,然后将结果缩小到作为用户的您(因此只有您创建的那些)。

    您还应该显示来自pre_task_plans 的一些行,像这样您只能看到自己的idfirst_name

    【讨论】:

    • 我只想查看users.*,具体来自pre_task_plan_users 表,我是pre_task_plan 的创建者。
    • 这只返回创建者
    • 谢谢,other 加入正是我所缺少的。我有SELECT other.* FROM users JOIN pre_task_plans AS ptp ON ptp.creator_id = users.id JOIN pre_task_plan_users AS ptpu ON ptpu.pre_task_plan_id = ptp.id JOIN users AS other ON ptpu.user_id = other.id WHERE users.id = 1 ORDER BY ptp.created_at DESC
    • @theartofbeing 然后你可以把它缩小到SELECT other.* FROM pre_task_plans AS ptp JOIN pre_task_plan_users AS ptpu ON ptpu.pre_task_plan_id = ptp.id JOIN users AS other ON ptpu.user_id = other.id WHERE ptp.creator_id = 1 ORDER BY ptp.created_at DESC - 你不需要第一个“用户”的任何东西 - where 可以直接应用于creator_id
    • 额外问题...我如何在ptp.created_at 订购时select distinct on users.id
    猜你喜欢
    • 2017-10-26
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多