Entity Attribute Value
またはEAV
データを保存するモデルをお勧めします。http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model(これがWordpressの投稿と投稿メタの仕組みです)。
したがって、次のようなテーブルを想定します。
ENTITY_TABLE: (id,title,author,content,date_created,date_modified)
ATTRIBUTE_TABLE: (id, entity_id, akey, avalue)
次のようなクエリを使用します。
SELECT e.*,
MAX( IF(m.akey= 'has_ac', m.avalue, 0) ) as 'has_ac',
MAX( IF(m.akey= 'has_garage', m.avalue, 0) ) as 'has_garage',
MAX( IF(m.akey= 'has_fridge', m.avalue, 0) ) as 'has_fridge',
MAX( IF(m.akey= 'latitude', m.avalue, 0) ) as 'latitude',
MAX( IF(m.akey= 'longitude', m.avalue, 0) ) as 'longitude'
FROM ENTITY_TABLE e
JOIN ATTRIBUTE_TABLE m ON e.id = m.entity_id
WHERE has_ac=1
エンティティとそれに関連する属性(has_ac、has_garage、has_fridge、緯度、経度)を選択し、選択したすべてのエンティティのhas_acが1(true)である必要があります。
さて、地理的なものについて:
SELECT e.*,
MAX( IF(m.akey= 'has_ac', m.avalue, 0) ) as 'has_ac',
MAX( IF(m.akey= 'has_garage', m.avalue, 0) ) as 'has_garage',
MAX( IF(m.akey= 'has_fridge', m.avalue, 0) ) as 'has_fridge',
MAX( IF(m.akey= 'latitude', m.avalue, 0) ) as 'latitude',
MAX( IF(m.akey= 'longitude', m.avalue, 0) ) as 'longitude',
(
3959 *
acos(
cos( radians( MAX( IF(m.akey= 'latitude', m.avalue, 0) ) ) ) *
cos( radians( CUSTOMER_LAT ) ) *
cos( radians( CUSTOMER_LONG ) - radians( MAX( IF(m.akey= 'longitude', m.avalue, 0) ) ) ) +
sin( radians( MAX( IF(m.akey= 'latitude', m.avalue, 0) ) ) ) *
sin( radians( CUSTOMER_LAT ) )
)
) AS distance
FROM ENTITY_TABLE e
JOIN ATTRIBUTE_TABLE m ON e.id = m.entity_id
WHERE has_ac=1
ORDER BY distance ASC