加入多个 ID

Bon*_*ono 0 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;
Run Code Online (Sandbox Code Playgroud)

这让我感觉很糟糕,因为我真的觉得我给了他一些乱七八糟的问题(不是他介意)。它让我想知道是否有更好的方法来写下它?

我试着在谷歌上寻找类似这些问题的东西:
- Mysql Left Join on multiple conditions
- MySQL 如何在两个字段上连接表
- https://dba.stackexchange.com/questions/33996/which-is-better-many-加入条件或多处条件

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

我知道数据库可能可以更好地建模,但这不是我要玩的数据库。我真的不同意他的桌子是如何构建的或任何东西,但这个问题对我来说仍然很有趣。

Bar*_*mar 6

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

但是,通常最好设计您的架构,这样您就没有重复的列,例如receiver_gets_1, receiver_gets_2, ...一次获得所有比赛。