2013-09-26 56 views
0

我真的不知道该怎么解释我需要什么,而不为例做,所以我希望我能解释自己不够好!选择加入

可以说我有以下各表在我的MySQL数据库:

buyers 
sellers 
adverts 
addresses 
locations 
object_addresses 

的表格buyerssellersadverts都是 “对象”。它们由object_addresses具有object_typeobject_idaddress_idaddresses有关。

addresses表具有location_id将其与位置相关联。

我最终想要的是选择在一定距离内的所有类型的对象(通过使用我在locations表中的经度和纬度)。

我没有与距离计算本身就是一个问题。但是,我无法选择所有“对象”以及它们各自的地址/位置(因为它们都使用object_address)。

我能够做到以下几点:

SELECT * FROM buyers as b 
INNER JOIN object_addresses as oa on oa.ObjectId = b.Id 
INNER JOIN addresses as a on oa.AddressId = a.Id 
INNER JOIN locations as l on a.LocationId = l.Id 
WHERE oa.ObjectType = 'buyer'; 

我有结合sellersadverts到上面的语句很难。

这可能是一个简单的答案,但我就是不能看到它今晚。任何人都可以将我指向正确的方向吗?

+0

做'object_addresse s'包含卖家和广告的相关列吗? –

+0

我已经更新了我的问题,但object_addresses只是具有object_type(例如买方,卖方或广告),object_id和address_id。 – James

+0

买家和卖家需要哪些领域?所有3种对象类型都有共同的字段吗? – GarethD

回答

1
SELECT * FROM buyers as b 
INNER JOIN object_addresses as oa on oa.ObjectId = b.Id 
INNER JOIN addresses as a on oa.AddressId = a.Id 
INNER JOIN locations as l on a.LocationId = l.Id 
WHERE oa.ObjectType = 'buyer' 
union 
SELECT * FROM sellers as s 
INNER JOIN object_addresses as oa on oa.ObjectId = s.Id 
INNER JOIN addresses as a on oa.AddressId = a.Id 
INNER JOIN locations as l on a.LocationId = l.Id 
WHERE oa.ObjectType = 'seller' 

etc?

,如果你不喜欢这样 - 基本上,你需要包括地址位多次 - 使每一个可以链接到每个对象类型...

+0

这几乎就是我想要的!联合的唯一问题是每个select都需要每个表中的相同列,不幸的是,我的模式不是这样! – James

0

使用连接特定条件试试这个oa.ObjectType = 'seller',oa.ObjectType = 'advert',oa.ObjectType = 'buyer'所以只有相关的结果集将加入

SELECT * FROM buyers as b 

INNER JOIN object_addresses as oa on (oa.ObjectId = b.Id AND oa.ObjectType = 'buyer') 
INNER JOIN advert as ad on (oa.ObjectId = ad.Id AND oa.ObjectType = 'advert') 
INNER JOIN seller as s on (oa.ObjectId = s.Id AND oa.ObjectType = 'seller') 
INNER JOIN addresses as a on oa.AddressId = a.Id 
INNER JOIN locations as l on a.LocationId = l.Id 

其他的解决办法是加入所有的表,然后检查对象类型

SELECT * FROM buyers as b 

INNER JOIN object_addresses as oa on (oa.ObjectId = b.Id) 
INNER JOIN advert as ad on (oa.ObjectId = ad.Id) 
INNER JOIN seller as s on (oa.ObjectId = s.Id) 
INNER JOIN addresses as a on oa.AddressId = a.Id 
INNER JOIN locations as l on a.LocationId = l.Id 
WHERE oa.ObjectType IN('buyer' , 'advert' , 'seller') 
+0

@downvoters关心解释 –

+0

我没有downvote,但我认为问题是,这将产生advert'和'seller',不是每一行对应一个'之间的交叉产品。 – Barmar

+1

您需要重新排列连接顺序。由于'object_addresses oa'尚未加入,因此在加入广告时不能引用'oa.objectType'。我认为这将工作,如果你确实与'object_addresses oa'交换'买家'b'' – GarethD