CASE WHEN查询未返回预期结果

时间:2016-06-23 07:41:28

标签: mysql wordpress

我正在尝试从Wordpress数据库的wp_usermeta表中获取数据。

对于那些不熟悉它的人来说,结构如下:

umeta_id | user_id | meta_key | meta_value
1        | 1       | role     | admin
2        | 1       | lat      | 12.34456
3        | 1       | lng      | 9.392933
4        | 2       | role     | user
5        | 2       | lat      | 8.694840
6        | 2       | lng      | 29.32930
7        | 3       | role     | subscriber
8        | 3       | lat      | 32.32323
9        | 3       | lng      | 3.222222
10       | 3       | some key | some value
... and so on

现在我在表格中有一个带有纬度和经度坐标的条目,这些条目由meta_key定义为" lat"或者"长" meta_value是坐标。

我想让每个用户使用他们的lat和long coords,如下所示:

user_id | lat      | lng
1       | 12.34456 | 9.392933
2       | 8.694840 | 29.32930
3       | 32.32323 | 3.222222

为此,我目前正在使用此查询:

SELECT umeta.user_id,
max(CASE WHEN umeta.meta_key = "lat" THEN umeta.meta_value END) AS lat,
max(CASE WHEN umeta.meta_key = "lng" THEN umeta.meta_value END) AS lng
FROM wp_usermeta umeta

只给了我:

user_id | lat      | lng
1       | 12.34456 | 9.392933

你们有什么想法我做错了吗? 帮助真的很感激!

2 个答案:

答案 0 :(得分:3)

您还需要按用户ID进行分组,以使透视查询按预期工作:

SELECT umeta.user_id,
       MAX(CASE WHEN umeta.meta_key = "lat" THEN umeta.meta_value ELSE 0 END) AS lat,
       MAX(CASE WHEN umeta.meta_key = "lng" THEN umeta.meta_value ELSE 0 END) AS lng
FROM wp_usermeta umeta
GROUP BY umeta.user_id

我在显式ELSE条件中设置了0值,但您可能不需要这个。

答案 1 :(得分:1)

您必须使用GROUP BY

SELECT umeta.user_id,
       max(CASE WHEN umeta.meta_key = "lat" THEN umeta.meta_value END) AS lat,
       max(CASE WHEN umeta.meta_key = "lng" THEN umeta.meta_value END) AS lng
FROM wp_usermeta umeta
GROUP BY umeta.user_id

如果没有GROUP BY子句,则SELECT子句中包含聚合函数的查询将返回始终一条记录。