MySQL WordPress 从 meta_value 中提取数据

标签 mysql wordpress

如何在每个meta_key都是一列的表中处理meta_key、meta_value对?

背景:我需要获取在 Learnpress(Wordpress 插件)中进行的每次购买的付款方式、数量以及两个日期之间进行付款的用户等。

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 中没有属性,那么它在最终表中应该为 null。

这样的事情怎么能完成呢? 提前致谢。

最佳答案

例如:

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       |
+---------+-----------+-------------+----------+

如果您能够找到一种根据数据类型将值分离到离散表中的方法,性能可能会有所提高。

关于MySQL WordPress 从 meta_value 中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42543666/

相关文章:

wordpress - 获取 Woocommerce 变体父属性

mysql - 如何在不使用索引的情况下选择最后 N 行

Mysql不通过触发器更新同表不同列的avg函数

php - MySQL 语句同时使用 JOIN、ON 和 WHERE 不起作用

mysql - 从 S3 文件构建临时表到 Redshift

css - 混合混合模式不适用于 elementor wordpress 网站

php - WordPress "admin-ajax.php"404 错误

php - WordPress 博客布局发布全宽然后网格

css - 删除 Ubermenu 元素上的悬停背景样式

mysql - SQL语法问题