Неизвестный столбец ‘O.order_id’ в SQL-запросе ‘on clause’ с WooCommerce

#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 использования, ваш main WHERE содержит a OIM.meta_key , которого НЕТ 'enrolment_id' , поэтому вы получаете только NULL s в своем MAX

3. Да, это, вероятно, попахивает SQL-запросом, который был составлен вместе! Можете ли вы предложить альтернативу?

4. у меня нет правильного понимания, tbh. Я бы предположил, что столбец WHERE on meta_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