MySQL语句想要在WordPress数据库

时间:2016-03-08 11:38:44

标签: mysql sql wordpress

使用名为Pods的WordPress插件,我定义了两种自定义帖子类型:场地事件。除了简单的元字段,Pods允许在帖子类型之间定义所谓的“关系”字段。

就我而言,我在 events 中使用了这样一个“关系”字段,将事件与场所联系起来。 Pod将相关场地帖子的post_id存储为事件帖子的met​​a_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。

1 个答案:

答案 0 :(得分: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 |
+----+------------------------+-----------+-----------------+---------------+------------+