У меня есть проблемы с этим, и я надеюсь, что это возможно.
У меня есть таблица из Wordpress, который хранит метаданные сообщения, таким образом, столбцы и полевые данные не могут быть изменены (Легко).
Структура таблицы таким образом
post_id meta_key meta_value
метаклавиша хранит имя поля и meta_value, значение для того поля. Я должен сгруппировать их на основе идентификатора сообщения, таким образом, я могу затем сделать сравнивание между двумя из полей. Я попробовал все виды!!
Таким образом, данные были бы следующие:
post_id meta_key meta_value
1 _wp_field0 10
1 _wp_field1 5
1 _wp_field2 9
1 _wp_field3 "matt's post"
1 _wp_field3 155
2 _wp_field0 51
2 _wp_field1 9
2 _wp_field2 18
2 _wp_field3 "james' post"
2 _wp_field3 199
Я сделал GROUP_CONCAT, который возвращается
post_id concat
1 10,5,9,matt's post,155
2 51,9,18,James' post,199
это является самым близким, я пришел к получению, что я хочу. Но я не уверен, как затем разделить это. У меня есть целая серия ints, который я хочу сравнить (fields1 и 2).
Мне нужны вторые и третьи числа от строки выше. Я могу сделать что-то в SQL для получения их? Я затем хочу сделать некоторую математику на нем. Они - в основном плавания, которые хранят долготу и широту, которая я хочу сравнить и получить расстояние....
Я думал о наличии временной таблицы? Все, в чем я нуждаюсь, должно сослаться на те два числа. Возможно, я могу разделить строку разделителем??
У меня закончились идеи. (PS), который я также попытался записать своей собственной функции (как ниже), но это несколько раз разрушало сервер!!
DROP FUNCTION get_lat;
DELIMITER $$
CREATE FUNCTION get_lat(in_post_id INT)
RETURNS FLOAT
READS SQL DATA
BEGIN
DECLARE latitude FLOAT;
SELECT meta_value INTO latitude FROM wp_postmeta WHERE post_id = in_post_id AND meta_key = 'field1';
RETURN (latitude);
END $$
DELIMITER;
DROP FUNCTION get_lon;
DELIMITER $$
CREATE FUNCTION get_lon(in_post_id INT)
RETURNS FLOAT
READS SQL DATA
BEGIN
DECLARE longitude FLOAT;
SELECT meta_value INTO longitude FROM wp_postmeta WHERE post_id = in_post_id AND meta_key = 'field2';
RETURN (longitude);
END $$
DELIMITER;
SELECT post_id,get_lat(post_id)as latitude, get_lon(post_id) as longitude FROM wp_postmeta GROUP BY post_id;
select t1.post_id, t1.meta_value as lat, t2.meta_value as lon
from metatdatatable t1, metadatatable t2
where t1.meta_key = "_wp_field1"
and t2.post_id = t1.post_id
and t2.meta_key = "_wp_field2"
... Чтобы использовать это в качестве основы для YR LAT / Long Calc, вы можете либо создать таблицу TEMP, либо использовать встроенные результаты с помощью запроса, похожего на (упрощенное расстояние) ниже
select d1.post_id, d1.distance
from
(select r1.post_id, ABS($lat - r1.lat) + ABS($lon - r1.lon) as DISTANCE
from (select t1.post_id, t1.meta_value as lat, t2.meta_value as lon
from metatdatatable t1, metadatatable t2
where t1.meta_key = "_wp_field1"
and t2.post_id = t1.post_id
and t2.meta_key = "_wp_field2") as r1
) as d1
where d1.distance <= 10
order by d1.distance ASC
NB. Возможно, вы захотите применить приблизительный фильтр на ваши результаты LAT / Lonv, прежде чем делать «дорогие» насыщенные расчета на результаты, или перед хранением в таблице TEMP. Идея будет игнорировать все результаты R1 явно за пределами радиуса 10 миль.
Если вы используете таблицу TEMP, это будет определенная сессия пользователя.
Взгляд Форма Земли для деталей для деталей для деталей для деталей . Достаточно 0,117 достаточно. Любая точка, отличающаяся более чем 0,117 от вашей цели, не может быть внутри вашего радиуса 10 миль. Это означает, что вы можете отфильтровать таблицу R1, как:
(select t1.post_id, t1.meta_value as lat, t2.meta_value as lon
from metatdatatable t1, metadatatable t2
where t1.meta_key = "_wp_field1"
and t2.post_id = t1.post_id
and t2.meta_key = "_wp_field2"
and ABS(t2.meta_value - $lon) < 0.117
and ABS(t1.meta_value - $lat) < 0.117
) as r1
Nb. Если ваши данные охватывают Гринвич Меридиан, Международную дату Линию или Экватор, это не будет строго правильно. Предполагая, что все ваши Lat / Longs для Северной Америки это не будет проблемой.
Чтобы присоединить таблицу к самой себе, вам нужно дать таблице псевдоним (как в случае с полем), а затем выбрать как из таблицы, так и из ее псевдонима.
Например.
SELECT table1.foo, table2.bar FROM table as table1, table as table2 WHERE table1.foo = table2.bar
Эта статья дает лучший пример того, как использовать этот синтаксис.
Попробуйте этот общий шаблон:
SELECT lon.post_id post_id, lat.meta_value lat, lon.meta_value lon
FROM wp_postmeta lon
INNER JOIN wp_postmeta lat
ON lon.post_id = lat.post_id
WHERE lon.meta_key = '_wp_field1'
AND lat.meta_key = '_wp_field2'