SQL在同一张表上多次联接

问题描述 投票:1回答:2

我正在尝试实现一个看起来很简单的查询,但是我无法使其正常工作。这是我的数据库表结构:

members
    -> id
    -> last_name
    -> first_name
activities
    -> id
registrations
    -> id
    -> member_id
tandems
    -> id
    -> activitie_id
    -> registration_member_one
    -> registration_member_two

这是我想要实现的目标:

多个成员可以注册到活动。然后,我将注册按tandems分组。我想要一个列出所有tandems的视图,这是我的问题。当我尝试查询时,它给了我多行,重复了很多次。

下面,是我想要的表格示例:

tandems.id | activities.id | registration_member_one.members.last_name | registration_member_two.members.last_name
1          | 3             | John Doe                                  | Jane Doe

这是我正在处理的查询:

SELECT
tandems.*,
memberOne.id, memberOne.last_name, memberOne.first_name,
memberTwo.id, memberTwo.last_name, memberTwo.first_name,
memberOne_registration.member_id as memberOne,
memberTwo_registration.member_id as memberTwo

FROM tandems

JOIN registrations as memberOne_registration
ON memberOne_registration.member_id = tandems.registration_member_one
JOIN members as memberOne ON memberOne.id = memberOne_registration.member_id

JOIN registrations as memberTwo_registration
ON memberTwo_registration.member_id = tandems.registration_member_two
JOIN members as memberTwo ON memberTwo.id = memberTwo_registration.member_id

WHERE activitie_id = 3;

任何帮助表示赞赏!

mysql sql
2个回答
0
投票

错误是由于member_id表的错误列(registrations)与tandems表的连接而引起的,而应使用registrations.id列。

SELECT
tandems.*,
memberOne.id, memberOne.last_name, memberOne.first_name,
memberTwo.id, memberTwo.last_name, memberTwo.first_name,
memberOne_registration.id as memberOne,
memberTwo_registration.id as memberTwo

FROM tandems
JOIN registrations as memberOne_registration ON memberOne_registration.id = tandems.registration_member_one
JOIN members as memberOne ON memberOne.id = memberOne_registration.member_id
JOIN registrations as memberTwo_registration ON memberTwo_registration.id = tandems.registration_member_two
JOIN members as memberTwo ON memberTwo.id = memberTwo_registration.member_id

WHERE activitie_id = 3;

0
投票

尽管其他查询实际上是相同的,但我讨厌使用不必要的长别名,因此对于注册表的两个实例使用“ r1”和“ r2”,而对于加入上下文的成员使用“ m1”和“ m2” 。

SELECT
        t.id,
        t.activitie_id,
        m1.last_name LastName1,
        m1.first_name FirstName1,
        m2.last_name LastName2,
        m2.first_name FirstName2
    FROM 
        tandems t
            LEFT join registrations r1
                ON t.registration_member_one = r1.id
                LEFT JOIN members m1
                    ON r1.member_id = m1.id
            LEFT join registrations r2
                ON t.registration_member_two = m2.id
                LEFT JOIN members m2
                    ON r2.member_id = m2.id
    WHERE 
        t.activitie_id = 3;

为了在将来以及将来为您提供帮助...尽管我已经尽心尽力,但我还是尝试着从我的第一张桌子的下游开始思考如何将这些碎片整理在一起。视觉缩进也可以看出这一点,就像从T到R1到M1的树视图扩展一样,然后R2到M2是不同的分支。我还希望在连接条件中列出左表/alias.column =右表/alias.column。 T如何到达R1,然后R1如何到达M1。

[在此情况下,我使用LEFT JOIN分别注册了每个成员和成员-以防万一,只有一个人注册,而另一个人可能还在等待中。不确定您的注册的实际结构。

© www.soinside.com 2019 - 2024. All rights reserved.