объединяющая таблица mysql на себе

У меня есть проблемы с этим, и я надеюсь, что это возможно.

У меня есть таблица из 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;
8
задан Matt Facer 8 January 2010 в 12:28
поделиться

3 ответа

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, это будет определенная сессия пользователя.

Отредактируйте 2

Взгляд Форма Земли для деталей для деталей для деталей для деталей . Достаточно 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 для Северной Америки это не будет проблемой.

7
ответ дан 5 December 2019 в 11:25
поделиться

Чтобы присоединить таблицу к самой себе, вам нужно дать таблице псевдоним (как в случае с полем), а затем выбрать как из таблицы, так и из ее псевдонима.

Например.

SELECT table1.foo, table2.bar FROM table as table1, table as table2 WHERE table1.foo = table2.bar

Эта статья дает лучший пример того, как использовать этот синтаксис.

4
ответ дан 5 December 2019 в 11:25
поделиться

Попробуйте этот общий шаблон:

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'
4
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: