我目前正在使用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
,lng
和lat
视为输出。
我对这部分感到满意,但它变得有点复杂了。我想对lng
和lat
值进行一些计算,看看它们是否在某个范围内。问题是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
当然是我事先计算的lng
和lat
范围。
所以,问题是;如何将lng
和lat
值转换为float,以便我可以对它们执行BETWEEN运算符?
答案 0 :(得分:1)
在where
之前应用group by
子句。 where
过滤器会检查每一行是否匹配lat
和lng
条件:
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
单个帖子的行组可以同时包含lat
和lng
。
MySQL应该将文本转换为自动浮动以进行转换。如果没有,您可以使用(1.0 * lat)
“强制”加倍。