使用 WooCommerce 'on clause' SQL 查询中的未知列 'O.order_id'

Unknown column 'O.order_id' in 'on clause' SQL query with WooCommerce

我下面的查询返回以下错误消息 "Unknown column 'O.order_id' in 'on clause'"。我猜这是一个优先级问题?但我没有足够的背景来弄清楚它可能在哪里。

我最近添加了 '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

不确定,但请尝试执行以下 INNER JOIN:

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

如您所料,问题出在逗号运算符和连接运算符的优先级上。

https://dev.mysql.com/doc/refman/8.0/en/join.html 上声明:

However, the precedence of the comma operator is less than that of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur.

意思是,最好不要混,

所以不是内部连接,只是

, 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 ...

只是另一个例子,为什么我对逗号运算符有如此强烈的反感。