2017-03-01 8 views
0

各meta_keyが列であるテーブルで、meta_key、meta_valueのペアをどのように処理できますか?MySQLのWordpressはmeta_valueからデータを抽出します

背景:私は、Learnpress(Wordpress Plugin)で行われた購入ごとに、支払方法、数量、および2つの日付間の支払いを行ったユーザーを取得する必要があります。

Learnpressは購買を投稿として保管し、各購入の属性をwp_postmetaのmeta_key、meta_valueのペアとして保存します。 wp_postmetaは異なる列で異なる属性を持っていた場合、私はこのような何かができる:

SELECT attribute1, attribute2, attribute3 FROM wp_postmeta, wp_posts 
WHERE wp_postmeta.post_id = wp_posts.ID; 

しかし、各ポストはwp_postmetaでN行、属性ごとに1行があります。どのようにデータを結合することができるので、各行のすべての属性が行に含まれるテーブルを取得できますか?

例:

wp_postテーブル

ID (Other Columns) 
1 
2 
3 

wp_postmeta table: 
ID post_id meta_key  meta_value 
1  1   user   testuser1 
2  1   payment_method paypal 
3  1   quantity  25 
(Other rows, with the same post_id, one for each attribute of this purchase) 
4  2   user   testuser2 
5  2   payment_method credit_card 
6  2   quantity  50 

Desired Result: 
Post_ID user  payment_method  quantity  (Other attributes) 
1   testuser1 paypal    25 
2   testuser2 credit_card   50 

注:一部の記事は、他の人よりも、それらに関連するより多くのpostmeta行を持っています。ポストメタに属性がない投稿は、最終的な表ではnullにする必要があります。

どうすればこのようなことが達成できますか? ありがとうございます。

答えて

0

例えば:あなたはデータの種類に応じて個別のテーブルに値を分離する方法を見つけ出すことができれば

DROP TABLE IF EXISTS wp_postmeta; 

CREATE TABLE wp_postmeta 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,post_id INT NOT NULL 
,meta_key VARCHAR(30) NOT NULL 
,meta_value VARCHAR(30) NOT NULL 
,UNIQUE(post_id,meta_key) 
); 

INSERT INTO wp_postmeta VALUES 
(1,1,'user','testuser1'), 
(2,1,'payment_method','paypal'), 
(3,1,'quantity',25), 
(4,2,'user','testuser2'), 
(5,2,'payment_method','credit_card'), 
(6,2,'quantity','50'); 

SELECT x.post_id 
    , MAX(CASE WHEN x.meta_key = 'user'   THEN x.meta_value END) user  
    , MAX(CASE WHEN x.meta_key = 'payment_method' THEN x.meta_value END) payment  
    , MAX(CASE WHEN x.meta_key = 'quantity'  THEN x.meta_value END) quantity 
    FROM wp_postmeta x 
GROUP 
    BY post_id; 

+---------+-----------+-------------+----------+ 
| post_id | user  | payment  | quantity | 
+---------+-----------+-------------+----------+ 
|  1 | testuser1 | paypal  | 25  | 
|  2 | testuser2 | credit_card | 50  | 
+---------+-----------+-------------+----------+ 

パフォーマンスを受けることができます。

+0

魅力的な作品です。私は、このクエリを、必要なmeta_key属性を持つ一時テーブルを作成し、それを他のテーブルと結合するように修正しました。ありがとう! – Raul

+0

@ラウル。良い。一時テーブルは正常ですが、不要です。サブクエリも同様に機能します。 – Strawberry

関連する問題