2016-06-23 2 views
2

Я пытаюсь получить данные из таблицы wp_usermeta базы данных Wordpress.CASE WHEN запрос не возвращает ожидаемые результаты

Для тех, кто не familliar с ней, структура выглядит следующим образом:

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» или «long», а meta_value - координаты.

Я хотел бы получить каждый пользователь с их широтой и длинными координатами, как это:

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 

Вы понимаете, что я делаю неправильно? Помогите действительно оценить!

ответ

3

Вы должны также групповой идентификатор пользователя, чтобы сделать работу запроса поворота, как и ожидался:

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

Проблема решена, спасибо! :) – Philex

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, возвращает всегда одна запись.

+0

Спасибо за помощь, она решила проблему :) – Philex

Смежные вопросы