Alias ​​de subconsulta SQL LEFT JOIN


87

Estou executando 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

E recebo este erro:

# 1054 - Coluna desconhecida 'a.post_id' na 'cláusula on'.

Acho que meu código é bem simples, mas não consigo corrigi-lo. O que estou fazendo errado?

Respostas:


146

Você não selecionou post_idna subconsulta. Você tem que selecioná-lo na subconsulta assim:

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 

1
Muito obrigado! Estou trabalhando em um problema semelhante e estava colocando a cláusula WHERE antes de LEFT JOIN e estava obtendo um erro. Isso realmente ajudou. Obrigado!
allardbrain

1
companheiro, você é uma lenda, vindo de pandas para SQL e eu estava coçando minha cabeça por um minuto me perguntando por que uma subconsulta não funcionaria. Felicidades.
Manakin

21

Reconheço que a resposta funciona e foi aceita, mas há uma maneira muito mais limpa de escrever essa consulta. Testado em mysql e 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 

1
Olá, Sem interesse, este método seria mais eficiente? Alternativamente, seria mais eficiente mover "AND wpp.meta_key = '_shipping_first_name'" para a cláusula WHERE?
Chris

1
Honestamente, não tenho ideia de nenhum deles. Acabei de encontrar essa resposta e percebi que havia uma maneira mais limpa de escrever a consulta, então achei que deveria apontar isso. Desculpe, eu não posso ajudar mais.
EJay

1
No MySQL / PostgreSQL você pode usar EXPLAIN SELECT ...ou para MSSQL SET SHOWPLAN_ALL ONou SET SHOWPLAN_XML ONpara ver como as linhas são recuperadas. No MySQL used filesort, used temporarysão lentos e devem ser evitados. Quanto à subconsulta associada, ela requer a recuperação de todas as linhas que correspondem ao valor meta_key da tabela wp_postmeta antes de ingressar nos ids de pós-pedido. Portanto, deve ser seguro presumir que seria mais rápido corresponder no pedido / ID do post e meta_key. Geralmente, uma subconsulta como a que você usou é melhor com uma ORDER BY LIMITque não pode ser filtrada da consulta principal.
Will B.

1
Exemplos dos resultados do SQLFiddle: Criteria on Join sqlfiddle.com/#!2/e84fa/5 e Subquery on Join sqlfiddle.com/#!2/e84fa/3 Observe que as Subquery on Join22 linhas recuperadas de wp_postmeta enquanto a Criteria on Joinúnica recuperou 1 de wp_postmeta.
Will B.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.