#mysql #sql #wordpress #woocommerce #orders
#mysql #sql #wordpress #woocommerce #заказы
Вопрос:
Мой запрос ниже возвращает следующее сообщение об ошибке «Неизвестный столбец ‘O.order_id’ в предложении ‘on'». Я предполагаю, что это проблема с приоритетом? Но у меня недостаточно знаний, чтобы понять, где это может быть.
Я только недавно добавил предложение ‘where’, чтобы я мог фильтровать по категориям продуктов.
SELECT
MAX(
CASE WHEN OIM.meta_key = 'enrolment_id' THEN(
SELECT
firstname
FROM
wp_sp_enrolments E
WHERE
OIM.meta_value = E.id
)
END
) AS 'firstname',
MAX(
CASE WHEN OIM.meta_key = 'enrolment_id' THEN(
SELECT
surname
FROM
wp_sp_enrolments E
WHERE
OIM.meta_value = E.id
)
END
) AS 'surname',
O.order_item_name AS 'school',
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
UM.meta_value
FROM
wp_usermeta UM,
wp_sp_enrolments E
WHERE
UM.meta_key = '_user_phone' AND UM.user_id = E.memberid AND E.id = OIM.meta_value
LIMIT 1
)
END
) AS 'phone', MAX(
CASE WHEN OIM.meta_key = 'enrolment_id' THEN(
SELECT
U.user_email
FROM
wp_users U,
wp_sp_enrolments E
WHERE
U.id = E.memberid AND E.id = OIM.meta_value
LIMIT 1
)
END
) AS 'email', P.post_status AS 'status'
FROM
wp_woocommerce_order_items O,
wp_terms T,
wp_term_taxonomy TT,
wp_term_relationships TR,
wp_woocommerce_order_itemmeta OIM
INNER JOIN wp_posts P ON
P.ID = O.order_id
WHERE
T.name = 'workshops' AND T.term_id = TT.term_id AND TT.taxonomy = 'product_cat' AND TT.term_id = TR.term_taxonomy_id AND TR.object_id = OIM.meta_value AND OIM.meta_key = '_product_id' AND OIM.order_item_id = O.order_item_id
GROUP BY
O.order_item_id
Комментарии:
1. вы уверены, что в нем есть столбец
order_id
wp_woocommerce_order_items
?2. Привет, да, определенно есть. Я предполагаю, существует ли он в том, что возвращается из запроса?
3. github.com/woocommerce/woocommerce/wiki /… тем не менее, согласен с вами…
4. мой плохой, вы правы насчет приоритета.
Ответ №1:
проблема, как вы и подозревали, в приоритете оператора запятой и оператора соединения.
на https://dev.mysql.com/doc/refman/8.0/en/join.html это заявлено:
Однако приоритет оператора запятой меньше, чем у INNER JOIN, CROSS JOIN, LEFT JOIN и так далее. Если вы смешиваете соединения через запятую с другими типами соединений при наличии условия соединения, может возникнуть ошибка вида Неизвестный столбец ‘col_name’ в предложении ‘on’.
это означает, что вы не должны смешивать, желательно.
поэтому вместо внутреннего соединения просто
, wp_posts P
и в WHERE
and P.id=O.order_id and P.id is not null
в качестве альтернативы вы можете заключить таблицы, разделенные запятыми, в круглые скобки:
(wp_woocommerce_order_items O,
wp_terms T,
wp_term_taxonomy TT,
wp_term_relationships TR,
wp_woocommerce_order_itemmeta OIM )
INNER JOIN ...
просто еще один пример, почему я испытываю такое сильное отвращение к оператору запятой.
Комментарии:
1. это отлично работает. К сожалению, каждый столбец, кроме ‘school’ и ‘status’, возвращает NULL. Есть идеи?
2. Однако я не поклонник вашего
MAX
использования, ваш mainWHERE
содержит aOIM.meta_key
, которого НЕТ'enrolment_id'
, поэтому вы получаете толькоNULL
s в своем MAX3. Да, это, вероятно, попахивает SQL-запросом, который был составлен вместе! Можете ли вы предложить альтернативу?
4. у меня нет правильного понимания, tbh. Я бы предположил, что столбец
WHERE
onmeta_key
, возможно , плохой? Я не знаю. недостаточно знаете о том, каков ваш вариант использования, и это значительно расширяет вопрос.
Ответ №2:
Не уверен, но попробуйте вместо этого выполнить следующие ВНУТРЕННИЕ объединения:
SELECT
MAX(
CASE WHEN OIM.meta_key = 'enrolment_id' THEN(
SELECT
firstname
FROM
wp_sp_enrolments E
WHERE
OIM.meta_value = E.id
)
END
) AS 'firstname',
MAX(
CASE WHEN OIM.meta_key = 'enrolment_id' THEN(
SELECT
surname
FROM
wp_sp_enrolments E
WHERE
OIM.meta_value = E.id
)
END
) AS 'surname',
O.order_item_name AS 'school',
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
UM.meta_value
FROM
wp_usermeta UM,
wp_sp_enrolments E
WHERE
UM.meta_key = '_user_phone' AND UM.user_id = E.memberid AND E.id = OIM.meta_value
LIMIT 1
)
END
) AS 'phone', MAX(
CASE WHEN OIM.meta_key = 'enrolment_id' THEN(
SELECT
U.user_email
FROM
wp_users U,
wp_sp_enrolments E
WHERE
U.id = E.memberid AND E.id = OIM.meta_value
LIMIT 1
)
END
) AS 'email', P.post_status AS 'status'
FROM wp_woocommerce_order_items O
INNER JOIN wp_woocommerce_order_itemmeta OIM ON
O.order_item_id = OIM.order_item_id
INNER JOIN wp_term_relationships TR ON
O.order_id = OIM.meta_value
INNER JOIN wp_term_taxonomy TT ON
TR.term_taxonomy_id = TT.term_taxonomy_id
INNER JOIN wp_terms T ON
T.term_id = TT.term_id
INNER JOIN wp_posts P ON
P.ID = O.order_id
WHERE T.name = 'workshops'
AND TT.taxonomy = 'product_cat'
AND OIM.meta_key = '_product_id'
GROUP BY
O.order_item_id