2016-08-07 21 views
0

次のように私は、単純なSELECTステートメントを持っている:MySQL Select Query - ユースケースを使用するか結合するか?

select p.ID as order_id, 
    p.post_date, 
    max(CASE WHEN pm.meta_key = '_billing_email' and p.ID = pm.post_id 
       THEN pm.meta_value END) as billing_email, 
    max(CASE WHEN pm.meta_key = '_billing_first_name' and p.ID = pm.post_id 
       THEN pm.meta_value END) as _billing_first_name, 
    max(CASE WHEN pm.meta_key = '_billing_last_name' and p.ID = pm.post_id 
       THEN pm.meta_value END) as _billing_last_name, 
    max(CASE WHEN pm.meta_key = '_order_total' and p.ID = pm.post_id 
       THEN pm.meta_value END) as order_total, 
    max(CASE WHEN pm.meta_key = '_order_tax' and p.ID = pm.post_id 
       THEN pm.meta_value END) as order_tax, 
    max(CASE WHEN pm.meta_key = '_paid_date' and p.ID = pm.post_id 
       THEN pm.meta_value END) as paid_date 
    from wp_posts as p, 
    wp_postmeta as pm 
    where post_type = 'shop_order' 
    and p.ID = pm.post_id 
    and 
    and post_status = 'wc-completed' 
    group by p.ID 

私は、JOIN構文を使用する必要があることが示唆されています - 私はWHEN CASEするのではなく、想定しています。私はJOINバージョンで作業を始めましたが、それほど冗長ではないようです - これが本当にベストプラクティスであり、処理するのがより効率的かどうか疑問に思っていますか?

私はSQLに慣れていないので、このように間違った方法をとっている可能性があるので、JOINを使用してこれを書き直す方法の例を見たいと思っています。あなたは最大で(p.post_dateを)p.post_dateを交換する必要があるかもしれません

+0

データをピボットしています。ピボット '条件付き集約'(あなたの現在のメソッド)はかなり妥当です。誰があなたにデータをピボットするために 'Join'を使うよう提案したのかは不明です。あなたのクエリで改善できるのは、 'INNER JOIN'構文を使用して'カンマ区切り結合 'を使用するのではなく、2つのテーブルを結合することだけです。 –

+0

あなたは何をしたいですか? –

答えて

1

内のデータを旋回させるための2つの方法が基本的にあります。 MySQL。

from wp_posts p join 
    wp_postmeta pm 
    on p.ID = pm.post_id 
where p.post_type = 'shop_order' and p.post_status = 'wc-completed' 

ポストについてのデータを組み合わせるためのあなたの方法で集計を使用しています:あなたは、明示的なjoinを持っているあなたのfrom句を修正する必要があります。 joinの方法は次のようになります。

select p.*, 
     pm_be.meta_value as billing_email, 
     pm_fn.meta_value as billing_first_name, 
from wp_posts p left join 
    wp_postmeta pm_be 
    on p.ID = pm_be.post_id and pm_be.meta_key = '_billing_email' left join 
    wp_postmeta pm_fn 
    on p.ID = pm_fn.post_id and pm_fn.meta_key = '_billing_first_name' left join 
     . . . 
where p.post_type = 'shop_order' and p.post_status = 'wc-completed' 

パフォーマンスが問題になる場合は、両方の方法を試してみる価値があります。それらはまったく同じではありません。

最初に、同じキー値を持つ可能性のある値の数にかかわらず、集計方法(あなたのメソッド)は投稿ごとに1つの行を生成します。 max()ではなく、group_concat()を使用してすべての値を取得できます。

joinメソッドは、指定されたキーに対して複数の行を返すので、これは利点です。これは一般的には必要ではありません。 group byを使用すると回避できますが、オーバーヘッドが発生します。

通常、インデックスは正しく設定されていると仮定して、テーブルからいくつかの列を取得する方が高速になります。集約メソッドの利点の1つは、新しいキーを追加すると基本的にオーバーヘッドが追加されないことです。本質的に集約はすでに高価であり、追加のmax()またはlistagg()はあまり追加しません。

方法に関係なく、次のような簡単な規則が1つあります。FROM句にカンマを使用しないでください。 常にJOINの構文にON句を明示的に使用します。

0

(ジョインを使用)、これを使用してみてください

select p.ID as order_id, 
    p.post_date, 
    max(CASE WHEN pm.meta_key = '_billing_email' THEN pm.meta_value END) as billing_email, 
    max(CASE WHEN pm.meta_key = '_billing_first_name' THEN pm.meta_value END) as _billing_first_name, 
    max(CASE WHEN pm.meta_key = '_billing_last_name' THEN pm.meta_value END) as _billing_last_name, 
    max(CASE WHEN pm.meta_key = '_order_total' THEN pm.meta_value END) as order_total, 
    max(CASE WHEN pm.meta_key = '_order_tax' THEN pm.meta_value END) as order_tax, 
    max(CASE WHEN pm.meta_key = '_paid_date' THEN pm.meta_value END) as paid_date 
    from wp_posts as p join 
    wp_postmeta as pm on (p.ID = pm.post_id) 
    where post_type = 'shop_order'and 
    and post_status = 'wc-completed' 
    group by p.ID 

select p.ID as order_id, 
    max(p.post_date), 
    max(CASE WHEN pm.meta_key = '_billing_email' THEN pm.meta_value END) as billing_email, 
    max(CASE WHEN pm.meta_key = '_billing_first_name' THEN pm.meta_value END) as _billing_first_name, 
    max(CASE WHEN pm.meta_key = '_billing_last_name' THEN pm.meta_value END) as _billing_last_name, 
    max(CASE WHEN pm.meta_key = '_order_total' THEN pm.meta_value END) as order_total, 
    max(CASE WHEN pm.meta_key = '_order_tax' THEN pm.meta_value END) as order_tax, 
    max(CASE WHEN pm.meta_key = '_paid_date' THEN pm.meta_value END) as paid_date 
    from wp_posts as p join 
    wp_postmeta as pm on (p.ID = pm.post_id) 
    where post_type = 'shop_order'and 
    and post_status = 'wc-completed' 
    group by p.ID 
関連する問題