0

如果没有例子,我真的不确定如何解释我需要做什么,所以我希望我能很好地解释自己!

假设我的 MySQL 数据库中有以下表:

buyers
sellers
adverts
addresses
locations
object_addresses

表格buyerssellers都是adverts“对象”。它们与addressesby object_addresseswhich hasobject_type和相关object_idaddress_id

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';

我很难将其sellers纳入adverts上述陈述中。

这可能是一个简单的答案,但我今晚看不到。谁能指出我正确的方向?

4

2 回答 2

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?

如果您不喜欢这样-基本上,您需要多次包含地址位-以便每个位都可以链接到每种对象类型...

于 2013-09-26T19:37:07.000 回答
0

在特定条件下使用 join 试试这个,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')
于 2013-09-26T19:40:18.803 回答