2012-07-25 91 views
1

我正在使用Wordpress並試圖創建一個視圖,使查看和分析度假村數據變得更容易一些。度假村數據存儲在Wordpress中的post_meta表中,並在稱爲「度假村」的自定義後期類型中引用。下面的查詢給我的結果集我想分析:將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_posts表alpinezone_postmeta和id POST_ID加入。

只想要結果,其中表alpinezone_posts的post_type是=「度假勝地」

我怎麼想它在新視圖

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

回答

4

你想用的是一個交叉列表表或數據透視表「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` 
+0

你是一個天才 – Nick 2012-07-26 23:29:02

+1

這個故事真棒,我希望更多的howtos會這樣寫:-) – Simon 2012-07-27 08:47:50

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()功能。

+0

西蒙,非常感謝!我覺得我非常接近,但我有兩個查詢問題。首先是我有一個叫做「long」的meta_key字段,它引發了一個錯誤。我猜這是因爲它以某種方式爲MySQL保留?嘗試在PHPMyAdmin中運行時遇到的另一個錯誤是#1064 - 您的SQL語法出錯;檢查與您的MySQL服務器版本相對應的手冊,以便在第37行的'FROM alpinezone_posts LEFT OUTER JOIN alpinezone_postmeta AS m1 ON alpinezon'附近使用正確的語法。雖然我看不到問題是什麼...... – Nick 2012-07-26 14:14:19

+1

是的,長是一個保留字。你需要用反引號引用它,''''''''''''語法錯誤可能是FROM關鍵字之前的逗號,您必須將其刪除。如果不是這樣,請發佈您的查詢。 – Simon 2012-07-27 08:35:17

+0

西蒙也非常感謝!不知道我會做什麼沒有像堆棧溢出資源! – Nick 2012-07-27 13:17:19