选择行作为 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 为什么要分组,因为他只有一个 idWHERE 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 分类字段作为变量