选择行作为 wordpress 帖子元的列

Posted

技术标签:

【中文标题】选择行作为 wordpress 帖子元的列【英文标题】:Select rows as columns for wordpress post meta 【发布时间】:2014-08-22 09:27:09 【问题描述】:

WordPress 的 wp_postmeta 表包含帖子的所有附加字段,但它们是成行的,因此很容易添加更多。

但是,现在我想查询所有帖子的所有字段,可以说,我显然希望这些字段在一列而不是一行。

这是我正在运行的查询

SELECT p.post_title, 
       m.meta_value, 
       m.meta_key 
FROM   wp_posts p 
       JOIN wp_postmeta m 
         ON p.id = m.post_id 
WHERE  p.id = 72697; 

这将为我提供所有元值及其各自的元键作为列。但我需要元键值作为列,元值作为行

例如,meta_key 可以是 additional_description,它的值可以是 What's up

所以我需要这样的东西

SELECT p.post_title, additional_description
FROM   wp_posts p 
       JOIN wp_postmeta m 
         ON p.id = m.post_id 
WHERE  p.id = 72697; 

我需要它作为一个专栏。我还需要所有帖子,而不是特定帖子,但每当我删除 where 时,它就不会查询(我有很多帖子,这可能是个问题)。

这是一些示例数据以及我希望结果如何显示 wp_postmeta 表

meta_key    post_id     meta_key    meta_value
1       5       total_related   5
2       5       updated     0
3       5       cricket     1
4       8       total_related   8
5       8       updated     1
6       8       cricket     0



wp_post table

id  post_title      other things I dont care about
5   This is awesome
8   This is more awesome

wp_post id 与 wp_postmeta 表上的 post_id 相关

想要的结果

post_title      total_related   updated     cricket
This is awesome     5       0       1
This is more awesome    8       1       0   

【问题讨论】:

样本数据,希望结果会更好。 这个问题已经被问过好几次了。有几种方法,每种方法都有优点和缺点。您要解决的一般问题是 EAV 模型。可以在此处找到几种方法的简要示例:http://***.com/questions/8764290/what-is-best-performance-for-retrieving-mysql-eav-results-as-relational-table 【参考方案1】:

这样的事情呢?

SELECT p.post_title, m1.meta_value as 'total_related', m2.meta_value as 'updated', m3.meta_value as 'cricket'
FROM wp_posts p
LEFT JOIN wp_postmeta m1
    ON p.id = m1.post_id AND m1.meta_key = 'total_related'
LEFT JOIN wp_postmeta m2
    ON p.id = m2.post_id AND m2.meta_key = 'updated'
LEFT JOIN wp_postmeta m3
    ON p.id = m3.post_id AND m3.meta_key = 'cricket'

而且由于您不是在寻找特定的帖子,因此您应该能够做到这一点。

如果你想查询特定的post_types 你可以试试这样的

SELECT p.post_title, m1.meta_value as 'total_related', m2.meta_value as 'updated', m3.meta_value as 'cricket'
FROM wp_posts p
LEFT JOIN wp_postmeta m1
    ON p.id = m1.post_id AND m1.meta_key = 'total_related'
LEFT JOIN wp_postmeta m2
    ON p.id = m2.post_id AND m2.meta_key = 'updated'
LEFT JOIN wp_postmeta m3
    ON p.id = m3.post_id AND m3.meta_key = 'cricket'
WHERE p.post_type = 'my_custom_post_type';

【讨论】:

最干净/易读的。我确实需要 post_type 条件,感谢您添加!【参考方案2】:

试试看:

select post_title , 
 MAX(CASE WHEN `meta_key`='total_related' THEN meta_value END)as 'total_related',
 MAX(CASE WHEN `meta_key` = 'updated' THEN meta_value END) as 'updated' ,
 MAX(CASE WHEN `meta_key` = 'cricket' THEN meta_value END) as 'cricket' 
FROM   wp_posts p 
JOIN wp_postmeta m ON p.id = m.post_id 
GROUP BY p.id

【讨论】:

@spencer7593 为什么要分组,因为他只有一个 id WHERE p.id = 72697 我需要查询多个帖子【参考方案3】:

有几种方法。

下面是使用 SELECT 列表中的相关子查询获取指定结果的一种方法示例:

SELECT p.post_title
     , ( SELECT m1.meta_value
           FROM wp_post_metadata m1
          WHERE m1.meta_key = 'total_related'
            AND m1.post_id = p.id
          ORDER BY m1.meta_key LIMIT 1
       ) AS `total_related`
     , ( SELECT m2.meta_value
           FROM wp_post_metadata m2
          WHERE m2.meta_key = 'updated'
            AND m2.post_id = p.id
          ORDER BY m2.meta_key LIMIT 1
       ) AS `updated`
     , ( SELECT m3.meta_value
           FROM wp_post_metadata m3
          WHERE m3.meta_key = 'cricket'
            AND m3.post_id = p.id
          ORDER BY m3.meta_key LIMIT 1
       ) AS `cricket`
  FROM wp_posts p
 WHERE p.id IN (5,8)

还有其他几种方法,每种方法都有自己的优点和缺点。

我在对该问题的评论中提到了一个有点相关的问题。该问题说明了几种方法,但省略了相关子查询方法。)

【讨论】:

以上是关于选择行作为 wordpress 帖子元的列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 将 WordPress 帖子堆叠到 3 个单独的列中?

Wordpress没有使用home.php而是使用index.php作为帖子页面。

在 Wordpress 自定义帖子类型循环中使用 ACF 分类字段作为变量

Wordpress 不使用 home.php 而是使用 index.php 作为帖子页面。

使用自定义帖子类型的标题列表作为 ACF 字段的值

怎样在word删除多余的表格