2011-06-27 168 views
1

我目前正在一个Wordpress网站上存储帖子类型的元值。元值作为键/值组合存储在名为wp_postmeta的表中。这意味着单个帖子的多个元值存储在不同的行中。将表格行转换为列(并投射到不同类型)

我已经在某种程度上能够成功地转了行作为使用下面的查询列:

SELECT post_id, 
MAX(CASE WHEN meta_key='store_lng' THEN meta_value END) AS lng, 
MAX(CASE WHEN meta_key='store_lat' THEN meta_value END) AS lat 
FROM wp_postmeta GROUP BY post_id 

在这里你可以看到,我从wp_postmeta表加载经纬度值和看到的输出post_id,lnglat

但我对这部分感到满意​​,但它变得更复杂一点。我想对lnglat值进行一些计算,看看它们是否在一定范围内。问题在于wp_postmeta表中的元值以文本形式存储。理想情况下,我想我的查询看起来像这样:

SELECT post_id, 
MAX(CASE WHEN meta_key='store_lng' THEN meta_value END) AS lng, 
MAX(CASE WHEN meta_key='store_lat' THEN meta_value END) AS lat 
FROM wp_postmeta GROUP BY post_id 
WHERE 
(lat BETWEEN %f AND %f) 
AND 
(lng BETWEEN %f AND %f) 

哪里%f当然是lnglat范围,我的手之前计算。

所以,问题是,我怎样才能得到lnglat值转换为浮点数,以便我可以在它们上执行BETWEEN运算符?

回答

1

where子句应用于group by之前。该where过滤器将检查每个行匹配两者latlng条件:

post_id meta_key meta_value 
1   store_lng 1.0 
1   store_lat 2.0 
2   store_lng 3.0 

由于每行仅限定一个单一的属性,没有行能满足这两个条件,并且查询应该总是返回一个空集。

要在group by之后应用滤镜,请使用having。例如:

.... 
FROM wp_postmeta 
GROUP BY post_id 
HAVING lat BETWEEN %f AND %f AND lng BETWEEN %f AND %f 

单个柱的组行中的可同时包含一个latlng

MySQL应该将文本转换为自动浮动进行转换。如果不是,您可以用(1.0 * lat)“强制”一倍。