#mysql #sql
#mysql #sql
Вопрос:
У меня есть запрос, который выполняет все, что мне нужно, но он кажется хрупким и определенно действительно сложным, и я бы хотел упростить его. Я думаю, что это сложно из-за необходимости сводить строки к столбцам для метаданных.
SELECT
O.order_item_id,
O.order_item_name,
MAX(CASE WHEN OIM.meta_key = 'class' THEN OIM.meta_value END) AS 'class',
MAX(CASE WHEN OIM.meta_key = 'fee-type' THEN OIM.meta_value END) AS 'fees',
MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN (
SELECT firstname FROM wp_enrolments E WHERE OIM.meta_value=E.id) END) as 'name',
MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN (
SELECT surname FROM wp_enrolments E WHERE OIM.meta_value=E.id) END) as 'surname',
MAX(CASE WHEN OIM.meta_key = 'enrolment_Id' THEN (
SELECT UM.meta_value
FROM wp_usermeta UM, wp_enrolments E
WHERE UM.meta_key='_user_phone'
AND UM.user_id=E.memberid
AND E.memberid=OIM.meta_value
AND OIM.meta_key='enrolment_id' LIMIT 1) END) as 'phone',
MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN (
SELECT U.user_email
FROM wp_users U, wp_enrolments E
WHERE U.id=E.memberid
AND E.memberid=OIM.meta_value
AND OIM.meta_key='enrolment_id' LIMIT 1) END) as 'email',
FROM wp_woocommerce_order_items O
INNER JOIN wp_woocommerce_order_itemmeta OIM ON O.order_item_id = OIM.order_item_id
GROUP BY O.order_item_id
Комментарии:
1. не могли бы вы, пожалуйста, опубликовать некоторые данные таблицы и выходные данные для лучшего понимания
Ответ №1:
Рассмотрите LEFT JOIN
все таблицы подзапросов, затем используйте эти столбцы в CASE
инструкциях. ПРИМЕЧАНИЕ: Без данных это непроверено и может потребовать корректировки, но может помочь вам пересмотреть SQL-запрос. Потребовалось два объединения wp_enrolments из-за разных полей объединения (id и memberid):
SELECT
O.order_item_id,
O.order_item_name,
MAX(CASE WHEN OIM.meta_key = 'class' THEN OIM.meta_value END) AS `class`,
MAX(CASE WHEN OIM.meta_key = 'fee-type' THEN OIM.meta_value END) AS `fees`,
MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN idE.firstname END) as `name`,
MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN idE.surname END) as `surname`,
MAX(CASE WHEN OIM.meta_key = 'enrolment_Id' AND UM.meta_key='_user_phone' THEN UM.meta_value END) as `phone`,
MAX(CASE WHEN OIM.meta_key = 'enrolment_id' THEN U.user_email END) as `email`
FROM wp_woocommerce_order_items O
INNER JOIN wp_woocommerce_order_itemmeta OIM
ON O.order_item_id = OIM.order_item_id
LEFT JOIN wp_enrolments idE
ON OIM.meta_value = idE.id
LEFT JOIN wp_enrolments memE
ON OIM.meta_value = memE.memberid
AND OIM.meta_key = 'enrolment_id'
LEFT JOIN wp_users U
ON U.id = memE.memberid
LEFT JOIN wp_usermeta UM
ON UM.user_id = memE.memberid
GROUP BY O.order_item_id,
O.order_item_name