加入多个ID

时间:2015-01-17 00:21:15

标签: mysql join

我一直在用他的一些MySQL查询帮助一个朋友,并提出了这个查询。在写这篇文章时,我有点想知道是否有更好的方法来做到这一点:

select offers.*, users.*, items.* from offers 
join users on users.id = offers.sender_id
join items on 
    (items.id = offers.receiver_gets_1)
or
    (items.id = offers.receiver_gets_2)
or
    (items.id = offers.receiver_gets_3)
or
    (items.id = offers.receiver_gets_4)
or
    (items.id = offers.sender_gets_1)
or
    (items.id = offers.sender_gets_2)
or
    (items.id = offers.sender_gets_3)
or
    (items.id = offers.sender_gets_4)
where receiver_id = 1;

这让我感觉很糟糕,因为我真的有这种感觉,我给了他一些搞砸了的询问(不是他的想法)。它让我想知道是否没有更好的方法来写下来?

我试着在google上寻找像这些问题的东西:
- Mysql Left Join on multiple conditions
- MySQL how to join tables on two fields
- https://dba.stackexchange.com/questions/33996/which-is-better-many-join-conditions-or-many-where-conditions

但这些并没有提供任何其他方式。我确实遇到了另一个问题,答案设置与我自己的查询相同。

我知道数据库可能可以更好地建模,但它不是我的数据库玩具。我真的不同意他的桌子是如何建立起来的,但是这个问题对我来说仍然很有意思。

1 个答案:

答案 0 :(得分:4)

您可以使用IN

select offers.*, users.*, items.* from offers 
join users on users.id = offers.sender_id
join items on 
    items.id IN (offers.receiver_gets_1, offers.receiver_gets_2, offers.receiver_gets_3, offers.receiver_gets_4, 
                 offers.sender_gets_1, offers.sender_gets_2, offers.sender_gets_3, offers.sender_gets_4)

但是,设计您的架构通常会更好,因此您不会重复列出receiver_gets_1receiver_gets_2等....,相反,您应该有一个关系如果这些表位于不同的行中,那么你只需要加入一次即可获得所有匹配。