将表行转换为列(并转换为不同的类型)

时间:2011-06-27 01:55:17

标签: mysql sql wordpress

我目前正在使用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_idlnglat视为输出。

我对这部分感到满意​​,但它变得有点复杂了。我想对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值转换为float,以便我可以对它们执行BETWEEN运算符?

1 个答案:

答案 0 :(得分: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)“强制”加倍。