如何编写包含可能不总是存在的条件行的自连接

nwwlzxa7  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(358)

以下对票证订单的查询将删除不包含“pa\u co-creation”的g.meta\u键值的行,因为不是每个票证类型都有此值。如何重新编写此查询以不删除这些行?

SELECT A.meta_value, B.meta_value, D.order_item_name, E.meta_value, F.meta_value, G.meta_value, H.meta_value, I.meta_value, J.meta_value, K.meta_value
FROM wp_postmeta A, wp_postmeta B, wp_woocommerce_order_items D, wp_woocommerce_order_itemmeta E, wp_woocommerce_order_itemmeta F, wp_woocommerce_order_itemmeta G, wp_woocommerce_order_itemmeta H, wp_woocommerce_order_itemmeta I, wp_postmeta J, wp_postmeta K
WHERE A.post_id = B.post_id AND B.post_id = D.order_id AND D.order_item_id = E.order_item_id AND E.order_item_id = F.order_item_id AND F.order_item_id = G.order_item_id AND G.order_item_id = H.order_item_id AND H.order_item_id = I.order_item_id AND A.post_id = J.post_id AND J.post_id = K.post_id
AND A.meta_key = '_billing_first_name' AND B.meta_key= '_billing_last_name' and D.order_item_type = 'line_item' And E.meta_key = 'pa_cabin-preference' AND F.meta_key = '_qty' AND G.meta_key = 'pa_co-creation' AND H.meta_key = 'pa_food' AND I.meta_key = 'pa_gluten' AND J.meta_key = '_billing_email' AND K.meta_key = '_billing_phone' AND D.order_id > 1014
mwkjh3gx

mwkjh3gx1#

这是一个相当大的问题。所以,如果有人回答你,那么为你重写整件事是没有意义的。
wordpress及其woocommerce扩展使用键值存储模式来存储任意元数据。正如您所发现的,当某些元数据丢失时,需要一些技巧来保留结果集中的行。
你需要 LEFT JOIN 为了这个(您使用的是旧的逗号连接语法:您像1999年一样参加聚会。)
下面是一个来自您的查询的示例。
从一个表开始,该表包含结果集中所需的每一行的一行。在wordpress中,这很可能是wp\u的帖子。

SELECT Z.post_id ...
  FROM wp_posts Z

然后像这样加入元数据

SELECT Z.postId, A.meta_value, ...
  FROM wp_posts Z
  LEFT JOIN wp_postmeta A ON Z.post_id = A.post_id AND A.meta_key = '_billing_first_name'

继续保持这种模式,直到你加入了每一项元数据,你就会像2018年一样参加派对。
为什么这样做?因为普通连接(逗号连接是其中的一种风格)会抑制结果集中未通过连接条件的行。但left join保留了这些行,并用空值代替缺少的值。

相关问题