2016-03-08 169 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