将Wordpress post_meta表转换为更易于使用的视图

时间:2012-07-25 16:44:28

标签: mysql wordpress

我正在使用Wordpress并尝试创建一个视图,以便更轻松地查看和分析我的度假村数据。度假村数据存储在Wordpress的post_meta表中,并在称为“度假村”的自定义帖子类型中引用。以下查询为我提供了我想要解析的结果集:

SELECT a.id, a.post_type, a.post_title, b.post_id, b.meta_key, b.meta_value
FROM alpinezone_postmeta b
INNER JOIN alpinezone_posts a ON a.id = b.post_id
WHERE a.post_type = "resorts" 

我想对这个结果集做什么是让我定义的集合的每个唯一meta_key成为一列,然后每一行应该是一个唯一的b.post_id(或a.id),它对应于一个单独的度假胜地的记录。

所以最终我最终得到了:

post_title |   phone_num      | state         |
resort1    |   800-200-1111   | Vermont       |
resort2    |   800-200-2222   | New Hampshire |
resort 3   |   800-200-2323   | Maine         |

基本上......我在MySQL上的表现并不是那么好,所以试图找出解决这个问题的最佳方法。我有一个列表,列出了我想要放入列的所有meta_key,其中有36个捕获了一系列信息。

编辑:更多细节。

当前结构 - 显示它来自哪个表

*alpinezone_posts   alpinezone_postmeta alpinezone_postmeta*
post_title          meta_key            meta_value
----------------------------------------------------------------
sugarloaf           snow_phone          888-234-2222
sugarloaf           vertical_feet       2300
sugarloaf           site_url            sugarloaf.com
wachusett           snow_phone          888-111-2222
wachusett           vertical_feet       1000
wachusett           site_url            wachusett.com

这两个表在表alpinezone_postmeta的post_id和表alpinezone_posts的id上连接。

只希望结果表albenzone_posts中的post_type =“resorts”

我希望它如何在新视图中查看

post_title  snow_phone      vertical_feet   site_url
-------------------------------------------------------
sugarloaf   888-234-2222    2300            sugarloaf.com
wachusett   888-111-2222    1000            wachusett.com

2 个答案:

答案 0 :(得分:5)

您想要使用的是带有“GROUP BY”的交叉表格或数据透视表,如下例所示:http://en.wikibooks.org/wiki/MySQL/Pivot_table

你需要使用除SUM()之外的其他东西来表示字符串......就像MAX(): http://forums.mysql.com/read.php?20,75357,75367#msg-75367

    SELECT p.post_title AS post_title,
         MAX(IF(m.meta_key='phone_num',m.meta_value,0)) AS phone_num,
         MAX(IF(m.meta_key='state',m.meta_value,0)) AS state
    FROM alpinezone_postmeta m
    INNER JOIN alpinezone_posts p ON m.post_id = p.id
    WHERE p.post_type = 'resorts'
    GROUP BY m.post_id`

答案 1 :(得分:1)

据我所知,每个度假村都有一个帖子,每个帖子都有一组或多或少完整的元数据。如果这是正确的,那么这里是如何构建一个生成您描述的表的查询。它不是很优雅,但它可以在不使用其他编程语言或Excel的情况下工作(Excel可能能够通过导出post_meta表来制作你想要的东西,但我的Excel-fu还不够好......)

SELECT posts.title,
    m1.meta_value as <your meta key 1>,
    m2.meta_value as <your meta key 2>,
    m3.meta_value as <your meta key 3>,
    ...
FROM alpinezone_posts
    LEFT OUTER JOIN alpinezone_postmeta AS m1 ON alpinezone_posts.id = m1.post_id,
    LEFT OUTER JOIN alpinezone_postmeta AS m2 ON alpinezone_posts.id = m2.post_id,
    LEFT OUTER JOIN alpinezone_postmeta AS m3 ON alpinezone_posts.id = m3.post_id,
    ...
WHERE 
    m1.meta_key = <your meta key 1>
    AND m2.meta_key = <your meta key 2>
    AND m3.meta_key = <your meta key 3>
    ...

使用LEFT OUTER JOIN代替INNER JOIN可确保您为每个度假村获得结果行,即使您没有每个meta_key的值。

如果您可以使用PHP并且HTML表格可以帮助您,您还可以循环所有帖子并使用get_post_custom()函数。