2017-03-01 88 views
0

如何在每个meta_key是列的表中处理meta_key,meta_value对?MySQL Wordpress从meta_value提取数据

背景:我需要为每次在Learnpress(Wordpress Plugin)中购买的付款方式,数量以及在两个日期之间付款的用户获得付款。

Learnpress将购买内容保存为帖子,并将每笔购买的属性保存为wp_postmeta中的meta_key,meta_value对。如果wp_postmeta曾在不同的列不同的属性,我可以做这样的事情:

SELECT attribute1, attribute2, attribute3 FROM wp_postmeta, wp_posts 
WHERE wp_postmeta.post_id = wp_posts.ID; 

然而,每个岗位有wp_postmeta N行,每一行对应一个属性。数据如何加入,以便我可以得到一个表格,其中一行包含每篇文章的所有属性?

例子:

wp_post表

ID (Other Columns) 
1 
2 
3 

wp_postmeta table: 
ID post_id meta_key  meta_value 
1  1   user   testuser1 
2  1   payment_method paypal 
3  1   quantity  25 
(Other rows, with the same post_id, one for each attribute of this purchase) 
4  2   user   testuser2 
5  2   payment_method credit_card 
6  2   quantity  50 

Desired Result: 
Post_ID user  payment_method  quantity  (Other attributes) 
1   testuser1 paypal    25 
2   testuser2 credit_card   50 

注:有些职位与他们有比别人更多的相关行postmeta。如果帖子在postmeta中没有属性,它应该在最终表中为null。

这样的事情可以如何完成? 在此先感谢。

回答

0

例如为:

DROP TABLE IF EXISTS wp_postmeta; 

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

INSERT INTO wp_postmeta VALUES 
(1,1,'user','testuser1'), 
(2,1,'payment_method','paypal'), 
(3,1,'quantity',25), 
(4,2,'user','testuser2'), 
(5,2,'payment_method','credit_card'), 
(6,2,'quantity','50'); 

SELECT x.post_id 
    , MAX(CASE WHEN x.meta_key = 'user'   THEN x.meta_value END) user  
    , MAX(CASE WHEN x.meta_key = 'payment_method' THEN x.meta_value END) payment  
    , MAX(CASE WHEN x.meta_key = 'quantity'  THEN x.meta_value END) quantity 
    FROM wp_postmeta x 
GROUP 
    BY post_id; 

+---------+-----------+-------------+----------+ 
| post_id | user  | payment  | quantity | 
+---------+-----------+-------------+----------+ 
|  1 | testuser1 | paypal  | 25  | 
|  2 | testuser2 | credit_card | 50  | 
+---------+-----------+-------------+----------+ 

性能可能会受益,如果你能想出一个办法,根据数据类型来进行分离值成离散的表。

+0

工程就像一个魅力。我调整了这个查询来创建一个具有所需meta_key属性的临时表,然后将它与其他表连接起来。谢谢! – Raul

+0

@Raul。好。临时桌子很好,但没有必要;子查询也可以工作。 – Strawberry