Entity Attribute Value
또는 EAV
데이터 저장 모델을 권장합니다. http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model (이것은 Wordpress Post 및 Post Meta 작업 방법입니다).
그래서 가정 테이블 같은 :
ENTITY_TABLE: (id,title,author,content,date_created,date_modified)
ATTRIBUTE_TABLE: (id, entity_id, akey, avalue)
이 같은 쿼리를 사용하여 개체 및 관련 특성 (has_ac, has_garage, has_fridge, 위도, 경도)를 선택합니다
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
및 선택한 모든 엔티티가 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
감사합니다. Francis. 그러나 이렇게하면 사용자가 "수영장 airco 콘도"를 검색 할 수 없습니다. 나는 이제 검색이 어떻게 작동해야하는지에 대한 나의 설명이 아주 분명하지 않다는 것을 깨닫는다. 집이 검색 자에게 제공 할 수있는 큰 옵션 목록이 없다는 점이 중요합니다. 그것은 자유 텍스트 여야합니다 (거리 부분 제외) –
내 2 센트 - 솔직히, 귀하의 의견을 바탕으로, 나는 당신이 잘못 생각하고 있다고 생각합니다. 속성 테이블과 태그 테이블'swimming pool'' airco'와'condo' 태그가 있어야합니다. Harvest 's Chosen과 같은 것을 사용하십시오 : http://harvesthq.github.com/chosen/ (Multiple Select 위젯을보십시오) –
제가 가볼 게요. 하지만 네 말이 말하는 말이 맞는 것 같아. 태그는 자동으로 생성 될 수 있으므로 사용자가 실제로 태그를 지정하지 않아도됩니다. –