Alias ​​de subconsulta SQL LEFT JOIN

87

Estoy ejecutando esta consulta SQL:

SELECT wp_woocommerce_order_items.order_id As No_Commande
FROM  wp_woocommerce_order_items
LEFT JOIN 
    (
        SELECT meta_value As Prenom
        FROM wp_postmeta
        WHERE meta_key = '_shipping_first_name'
    ) AS a
ON wp_woocommerce_order_items.order_id = a.post_id
WHERE  wp_woocommerce_order_items.order_id =2198

Y me sale este error:

# 1054 - Columna desconocida 'a.post_id' en 'cláusula on'.

Creo que mi código es bastante simple, pero no puedo corregirlo. ¿Qué estoy haciendo mal?

CharleyXIV
fuente

Respuestas:

146

No seleccionó post_iden la subconsulta. Tienes que seleccionarlo en la subconsulta así:

SELECT wp_woocommerce_order_items.order_id As No_Commande
FROM  wp_woocommerce_order_items
LEFT JOIN 
    (
        SELECT meta_value As Prenom, post_id  -- <----- this
        FROM wp_postmeta
        WHERE meta_key = '_shipping_first_name'
    ) AS a
ON wp_woocommerce_order_items.order_id = a.post_id
WHERE  wp_woocommerce_order_items.order_id =2198 
Mahmoud Gamal
fuente
1
Muchas gracias! Estoy trabajando en un problema similar y estaba poniendo la cláusula WHERE antes de LEFT JOIN y recibía un error. Esto realmente ayudó. ¡Gracias!
allardbrain
1
amigo, eres una leyenda, viniendo de pandas a SQL y estuve rascándome la cabeza durante un minuto preguntándome por qué una subconsulta no funcionaría. salud.
Manakin
21

Reconozco que la respuesta funciona y ha sido aceptada, pero hay una forma mucho más limpia de escribir esa consulta. Probado en mysql y postgres.

SELECT wpoi.order_id As No_Commande
FROM  wp_woocommerce_order_items AS wpoi
LEFT JOIN wp_postmeta AS wpp ON wpoi.order_id = wpp.post_id 
                            AND wpp.meta_key = '_shipping_first_name'
WHERE  wpoi.order_id =2198 
EJay
fuente
1
Hola, Interesante, ¿este método sería más eficiente? Alternativamente, ¿sería más eficiente mover "AND wpp.meta_key = '_shipping_first_name'" a la cláusula WHERE?
Chris
1
Honestamente, no tengo ni idea de ninguno de esos. Acabo de encontrar esta respuesta y noté que había una forma más limpia de escribir la consulta, así que pensé que lo señalaría. Lo siento, no puedo ser de más ayuda.
EJay
1
En MySQL / PostgreSQL puede usar EXPLAIN SELECT ...o para MSSQL SET SHOWPLAN_ALL ONo SET SHOWPLAN_XML ONpara ver cómo se recuperan las filas. En MySQL used filesort, used temporaryson lentos y deben evitarse. En cuanto a la subconsulta unida, requiere recuperar todas las filas que coincidan con el valor de meta_key de la tabla wp_postmeta antes de unirse a los ID de publicación / pedido. Por lo tanto, debería ser seguro asumir que sería más rápido hacer coincidir los ID de pedido / publicación y meta_key. Generalmente, una subconsulta como la que usó es mejor con una ORDER BY LIMITque no se puede filtrar de la consulta principal.
Will B.
1
Ejemplos de resultados de SQLFiddle: Criteria on Join sqlfiddle.com/#!2/e84fa/5 y Subquery on Join sqlfiddle.com/#!2/e84fa/3 Tenga en cuenta que las Subquery on Join22 filas recuperadas de wp_postmeta, mientras que la Criteria on Joinúnica recuperada 1 de wp_postmeta.
Will B.