0

例がないと、何をする必要があるかを説明する方法がよくわからないので、自分自身を十分に説明できることを願っています!

MySQL データベースに次のテーブルがあるとします。

buyers
sellers
adverts
addresses
locations
object_addresses

テーブルbuyerssellersおよびテーブルadvertsはすべて「オブジェクト」です。それらは、 which has 、およびaddressesによって関連付けられています。object_addressesobject_typeobject_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'

等?

それが気に入らない場合は、基本的に、アドレスビットを複数回含める必要があるため、それぞれを各オブジェクトタイプにリンクできるようにします...

于 2013-09-26T19:37:07.000 に答える
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')
于 2013-09-26T19:40:18.803 に答える