簡體   English   中英

MySQL Select查詢-用例何時或加入?

[英]MySQL Select Query - Use Case When or Join?

我有一個簡單的Select語句,如下所示:

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語法-我假設使用的不是CASE WHEN。 我已經開始研究JOIN版本,但到目前為止,它似乎還不那么冗長-只是想知道這是否確實是最佳實踐,並且處理效率更高?

我是SQL的新手,我正在學習,所以很想看看如何使用JOIN重寫它的示例,因為我可能會以錯誤的方式進行操作。

在MySQL中,基本上有兩種數據透視方法。 您應該修復您的from子句以具有顯式join

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方法如下所示:

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'

如果性能是一個問題,那么值得嘗試兩種方法。 它們並不完全相同。

首先,聚合方法(您的方法)每個帖子僅產生一行,而與可能具有相同鍵值的值的數量無關。 您可以使用group_concat()而不是max()獲得所有值。

這是一個優點,因為join方法將為給定的鍵返回多個行,而這通常不是您想要的。 您可以使用group by解決它,但這會產生開銷。

假設索引設置正確, join方法通常會更快地從表中獲取少數列。 聚合方法的一個優點是,添加新鍵基本上不會增加​​開銷-本質上,聚合已經非常昂貴,以至於額外的max()listagg()不會增加太多。

無論使用哪種方法,都應遵循一個簡單的規則: 切勿FROM子句中使用逗號。 始終使用帶有ON子句的顯式JOIN語法。

嘗試使用它(使用連接)

   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

您可能需要用max(p.post_date)替換p.post_date

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM