Как написать самостоятельное объединение, включающее строки с условиями, которые могут присутствовать не всегда - PullRequest
0 голосов
/ 16 сентября 2018

Следующий запрос для заказов билетов удалит строки, которые не содержат значение G.meta_key 'pa_co-creation', поскольку не у каждого типа билета есть это значение. Как я могу переписать этот запрос, чтобы не отбрасывать эти строки?

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

1 Ответ

0 голосов
/ 16 сентября 2018

Это довольно массивный запрос.Поэтому нет смысла, когда кто-то отвечает вам на SO, чтобы переписать все для вас.

WordPress с его расширением WooCommerce использует паттерн key-value-store для хранения произвольных метаданных.Как вы обнаружили, для сохранения строк в результирующих наборах требуется некоторое изящество, когда некоторые метаданные отсутствуют.

Для этого вам нужно 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'

и продолжайте работать с этим шаблоном, пока вы не присоединитесь к каждому элементуметаданных, и вы будете веселиться, как будто это 2018.

Почему это работает?Потому что обычный JOIN (из которых запятое является разновидностью) подавляет строки из вашего набора результатов, которые не соответствуют условию JOIN.Но LEFT JOIN сохраняет эти строки и представляет значения NULL вместо отсутствующего значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...