2016-01-19 3 views
0

Я пытаюсь обернуть голову вокруг запроса таблицы «Значение атрибута объекта», как вы находите в таблице WordPress postmeta, которая содержит метаданные о сообщениях.Как вы запрашиваете различные отношения между таблицей «Значение атрибута объекта» и другой таблицей?

Обратите внимание, что я не запрашиваю базу данных из WordPress.

Так вот некоторые примеры данные из wp_postmeta таблицы, которая показывает данные из двух разных событий, в том же _EventVenueID:

+---------+---------+-------------------+---------------------+ 
| meta_id | post_id | meta_key   | meta_value   | 
+---------+---------+-------------------+---------------------+ 
| 3914 | 422  | _EventStateDate | 2016-01-27 01:00:00 | 
| 3915 | 422  | _EventEndDate  | 2016-01-27 02:00:00 | 
| 3400 | 422  | _EventVenueID  | 333     | 
| 3916 | 422  | _EventOrganizerID | 410     | 
| 3917 | 423  | _EventStartDate | 2017-01-28 01:00:00 | 
| 3918 | 423  | _EventEndDate  | 2017-01-28 02:00:00 | 
| 3401 | 423  | _EventVenueID  | 333     | 
| 3919 | 423  | _EventOrganizerID | 411     | 
+---------+---------+-------------------+---------------------+ 

А вот некоторые примеры данные из усеченной версии wp_posts таблицы:

+---------+------------+-----------------+-------------+ 
| ID  | post_title | post_type  | post_status | 
+---------+------------+-----------------+-------------+ 
| 422  | Picnic  | tribe_events | publish  | 
| 423  | Concert | tribe_events | publish  | 
| 411  | Bob Jones | tribe_organizer | publish  | 
| 410  | Mary Smith | tribe_organizer | publish  | 
| 333  | Park  | tribe_venue  | publish  | 
+---------+------------+-----------------+-------------+ 

Как вы можете видеть, существуют три вида сущностей: события, организаторы и места проведения. На каждом мероприятии может быть одно место и один или несколько организаторов. Также обратите внимание, что столбец wp_posts.ID индексирует столбец wp_postmeta.post_id, а также столбец wp_postmeta.meta_value.

Так что, если я хочу, чтобы вытащить данные события для конкретного места (в данном случае, парк), я могу сделать это с этим запросом:

SELECT pm1.meta_value AS _EventVenueID, 
    p.post_title, 
    pm2.meta_value AS _EventStartDate, 
    pm3.meta_value AS _EventEndDate, 
    pm4.meta_value AS _EventOrganizerID 
    FROM wp_posts p 
    LEFT JOIN wp_postmeta AS pm1 ON (p.ID = pm1.post_id AND pm1.meta_key='_EventVenueID') 
    LEFT JOIN wp_postmeta AS pm2 ON (p.ID = pm2.post_id AND pm2.meta_key='_EventStartDate') 
    LEFT JOIN wp_postmeta AS pm3 ON (p.ID = pm3.post_id AND pm3.meta_key='_EventEndDate') 
    LEFT JOIN wp_postmeta AS pm4 ON (p.ID = pm4.post_id AND pm4.meta_key='_EventOrganizerID') 
    WHERE p.post_type = 'tribe_events' AND p.post_status = 'publish' 
    HAVING _EventVenueID = 333 

Теперь, скажем, я хочу, чтобы выбрать имя организатора в качестве столбца тоже. Итак, другими словами, я хочу связать _EventOrganizerId в таблице wp_postmeta с данными, находящимися в таблице wp_posts, поэтому я также могу вытащить post_title для организатора, связанного с событием.

Как это сделать?

UPDATE на вопрос о желаемом выходе в комментариях:

В настоящее время я получаю выход, как это на результате строки:

[ 
    '333', 
    'Picnic', 
    '2016-01-27 01:00:00', 
    '2016-01-27 02:00:00', 
    '410' 
    ], 

То, что я хочу, чтобы получить то же самое, но с именем организатора, тоже:

[ 
    '333', 
    'Picnic', 
    '2016-01-27 01:00:00', 
    '2016-01-27 02:00:00', 
    '410', 
    'Mary Smith' 
    ], 
+0

Как бы выглядел желаемый результат? – Strawberry

+0

См. Обновление в нижней части вопроса для вашего ответа @Strawberry – StevieD

ответ

1

Это просто больше того же самого ...

SELECT pm1.meta_value _EventVenueID 
    , p1.post_title event_type 
    , p2.post_title organiser 
    , pm2.meta_value _EventStartDate 
    , pm3.meta_value _EventEndDate 
    , pm4.meta_value _EventOrganizerID 
    FROM wp_posts p1 
    JOIN wp_postmeta pm1 
    ON p1.ID = pm1.post_id 
    AND pm1.meta_key = '_EventVenueID' 
    LEFT 
    JOIN wp_postmeta pm2 
    ON p1.ID = pm2.post_id 
    AND pm2.meta_key = '_EventStartDate' 
    LEFT 
    JOIN wp_postmeta pm3 
    ON p1.ID = pm3.post_id 
    AND pm3.meta_key = '_EventEndDate' 
    LEFT 
    JOIN wp_postmeta pm4 
    ON p1.ID = pm4.post_id 
    AND pm4.meta_key = '_EventOrganizerID' 

    LEFT 
    JOIN wp_posts p2 
    ON p2.id = pm4.meta_value 

WHERE p1.post_type = 'tribe_events' 
    AND p1.post_status = 'publish' 
    AND pm1.meta_value = 333; 
+0

Спасибо. Работал как шарм. Я программист-хобби. Я знаю только базовый синтаксис sql и не понимаю, что происходит с этим запросом. Как вы называете такой запрос, чтобы я мог искать его и узнать больше? Похоже, это просто одно большое соединение таблицы к себе снова и снова? – StevieD

+0

Я подозреваю, что большинство из нас здесь любители ;-) Это своего рода сводный столбец, но на самом деле это просто большой запрос. Это (почти) неизбежное следствие EAV. На самом деле существует еще один, более простой способ написать это, но этот метод выполняется быстрее. – Strawberry

+0

Один последующий вопрос. Возможно, что на мероприятии может быть более одного органайзера. Как мне это обработать? – StevieD

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