我會推薦存儲數據的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(真)
現在對於地理內容:
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
非常感謝弗朗西斯。但是,這不允許用戶搜索「游泳池空調公寓」。我現在意識到我對搜索應該如何工作的描述不是很清楚。 重要的是,沒有一個房子可供搜索者使用的大型選項列表。它應該是自由文本(除了距離部分) – 2012-07-25 08:44:06
我的2cents - 老實說,根據你的評論,我認爲你是在做這樣的錯誤。你應該有一個財產表和一個標籤表'游泳池''airco'和'condo'就是標籤。然後使用Harvest's Chosen之類的東西:http://harvesthq.github.com/chosen/(看看Multiple Select小工具) – 2012-07-26 15:49:32
我會去看看。但我認爲你所說的話是有道理的。標籤可以自動生成,所以用戶實際上不會這樣做。 – 2012-07-28 15:24:11