以下对票证订单的查询将删除不包含“pa_co-creation”的 G.meta_key 值的行,因为并非每个票证类型都具有此值。如何重写此查询以不删除这些行?
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
这是一个相当大的查询。所以,有人在 SO 上回答你为你重写整个事情是没有意义的。
WordPress 及其 WooCommerce 扩展使用键值存储模式来存储任意元数据。正如您所发现的,当某些元数据丢失时,在结果集中保留行需要一些技巧。
你需要LEFT JOIN
这个。(您正在使用旧的逗号连接语法:您正在聚会,就像 1999 年一样。)
这是从您的一些查询中获取的示例。
从一个表开始,该表包含您想要在结果集中的每一行的行。在 WordPress 中,这很可能是 wp_posts。
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'
并继续采用这种模式,直到您将每个元数据项 LEFT JOIN 加入,您就会像 2018 年一样狂欢。
为什么这样做?因为普通的 JOIN(其中逗号连接是一种风格)会抑制结果集中不符合 JOIN 条件的行。但是 LEFT JOIN 保留这些行并显示 NULL 值代替缺失值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句