2

私は 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

これら 2 つのテーブルは、テーブル alpinezone_postmeta の post_id とテーブル alpinezone_posts の id で結合されています。

テーブル alpinezone_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
4

3 に答える 3

7

使用するのは、次の例のような「GROUPBY」を含むクロス集計テーブルまたはピボットテーブルです: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`
于 2012-07-26T22:02:32.273 に答える
0

リゾートごとに 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()関数を使用することもできます。

于 2012-07-25T21:07:39.430 に答える