2016-03-08 171 views
0

相關的自定義後類型職位使用WordPress插件叫做Pods,我定義了兩個自定義文章類型:場地事件。除了簡單的元字段之外,Pods還允許在帖子類型之間定義所謂的「關係」字段。MySQL的聲明想查詢在WordPress數據庫

就我而言,我使用了這樣的「關係」字段事件,涉及事件的場地。 Pods存儲相關場所 post_id作爲meta_value的事件後。

現在,在WordPress'管理員我想擴展編輯視圖爲我的自定義帖子類型事件。我想讓事件列表排序場地。 我的問題是,MySQL聲明必須如何實現這一目標?我有麻煩纏住我的頭,這兩個事件,事件場館,都存儲爲wp_post表中的帖子。

相關架構如下:

wp_posts 
(id 
,post_title 
,post_type 
) 

wp_postmeta 
(meta_id 
,post_id 
,meta_key 
,meta_value 
) 

我在尋找類似

SELECT t1.post_title AS event_title 
    , t2.meta_value AS venue 
    FROM wp_posts AS t1 
    JOIN wp_postmeta AS t2 
    ON t2.post_id = t1.id 
WHERE t1.post_type = 'event' 
    AND t2.meta_key = 'event_venue' 

上面的說法讓我的事件的標題與相關場地的ID一起。有了這個ID,我需要再次查詢wp_posts和wp_postmeta(... WHERE t1.post_type = 'venue' ...)來檢索相關場地的標題和其他字段。那麼,如何在一個查詢中做到這一點?

Bunjip。

請注意:這個問題有關如何擴展WordPress管理或如何使用WP鉤來顯示後列出自定義列,也不如何使這些列表排序的自定義列。我需要的只是正確的SQL語句。這就是爲什麼我沒有發佈我的問題到wordpress.stackexchange.com。

+0

@Strawberry:看,這兩個活動和場地均以WordPress的形式發佈。他們是自定義帖子類型的帖子。活動有一個標有'event_venue'的自定義元字段,其中包含任何自定義帖子類型'場地'的帖子的post_id。我編輯了僞SQL語句來清除。 – Bunjip

回答

0

考慮下面的,這既回答了這個問題,並解釋如何要求... ...

注意,使用EAV像這樣的時候,它仍然是有用的,如果能夠構建您的數據,這樣就可以利用數據類型。所以,日期,字符串和整數都會放到不同的表中。

DROP TABLE IF EXISTS wp_posts; 

CREATE TABLE wp_posts 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,post_title VARCHAR(30) NOT NULL 
,post_type VARCHAR(30) NOT NULL 
); 

INSERT INTO wp_posts VALUES 
(1,'Adele at the O2','event'), 
(2,'Springsteen at Wembley','event'), 
(3,'Twickenham Car Boot Sale','market'); 

DROP TABLE IF EXISTS wp_postmeta; 

CREATE TABLE wp_postmeta 
(post_id INT NOT NULL 
,meta_key VARCHAR(30) NOT NULL 
,meta_value VARCHAR(30) NOT NULL 
,PRIMARY KEY(post_id,meta_key) 
); 

INSERT INTO wp_postmeta VALUES 
(1,'venue','The O2 Arena'), 
(1,'date','2016-03-08'), 
(2,'venue','Wembley Stadium'), 
(2,'support_act','Dan Patlansky'), 
(2,'date','2016-03-09'), 
(3,'venue','Twickenham Car Park'), 
(3,'date','2016-03-08'); 



SELECT p.* 
    , venue.meta_value venue 
    , support_act.meta_value support_act 
    , date.meta_value date 
    FROM wp_posts p 
    LEFT 
    JOIN wp_postmeta venue 
    ON venue.post_id = p.id 
    AND venue.meta_key = 'venue' 
    LEFT 
    JOIN wp_postmeta support_act 
    ON support_act.post_id = p.id 
    AND support_act.meta_key = 'support_act' 
    LEFT 
    JOIN wp_postmeta date 
    ON date.post_id = p.id 
    AND date.meta_key = 'date' 
WHERE p.post_type = 'event'; 

+----+------------------------+-----------+-----------------+---------------+------------+ 
| id | post_title    | post_type | venue   | support_act | date  | 
+----+------------------------+-----------+-----------------+---------------+------------+ 
| 1 | Adele at the O2  | event  | The O2 Arena | NULL   | 2016-03-08 | 
| 2 | Springsteen at Wembley | event  | Wembley Stadium | Dan Patlansky | 2016-03-09 | 
+----+------------------------+-----------+-----------------+---------------+------------+ 
+0

非常感謝您的回答@Strawberry。據我所知,你建議的數據模型稍微不同於我使用的數據模型。雖然我理解你的方法,但恐怕它不能解決我的問題。如果我想保持與我的WP應用程序的其他部分一致,我無法按照您的建議更改數據結構。所以,場地數據集也必須存儲在wp_posts表中。實際上,它們在應用程序的其他部分也被稱爲單個對象。 – Bunjip

+0

@Bunjip此示例完全遵循您的數據模型。 – Strawberry

+0

糟糕,所以我必須在這裏得到一些錯誤......我只是無法識別場地帖子插入到wp_posts表中。因此,我認爲數據模型會不同... – Bunjip