我一直在帮助一个朋友解决他的一些 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-加入条件或多处条件
但这些并没有真正提供任何其他方式。我确实遇到了另一个问题,其中答案的设置与我自己的查询相同。
我知道数据库可能可以更好地建模,但这不是我要玩的数据库。我真的不同意他的桌子是如何构建的或任何东西,但这个问题对我来说仍然很有趣。
您可以使用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, ...一次获得所有比赛。
| 归档时间: |
|
| 查看次数: |
5046 次 |
| 最近记录: |