我一直在用他的一些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
但这些并没有提供任何其他方式。我确实遇到了另一个问题,答案设置与我自己的查询相同。
我知道数据库可能可以更好地建模,但它不是我的数据库玩具。我真的不同意他的桌子是如何建立起来的,但是这个问题对我来说仍然很有意思。
答案 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_1
,receiver_gets_2
等....,相反,您应该有一个关系如果这些表位于不同的行中,那么你只需要加入一次即可获得所有匹配。