Преобразовать строки таблицы в столбцы (и привести к разным типам) - PullRequest
1 голос
/ 27 июня 2011

В настоящее время я работаю над сайтом 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 для преобразования в число с плавающей точкой, чтобы я мог выполнить оператор BETWEEN для них?

1 Ответ

1 голос
/ 27 июня 2011

Предложение 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...