SQL LEFT JOIN Alias ​​sottoquery


91

Sto eseguendo questa query 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 ottengo questo errore:

# 1054 - Colonna sconosciuta "a.post_id" nella "clausola on".

Penso che il mio codice sia piuttosto semplice, ma non riesco a farlo bene. Che cosa sto facendo di sbagliato?

Risposte:


151

Non hai selezionato post_idnella sottoquery. Devi selezionarlo nella sottoquery in questo modo:

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
Grazie mille! Sto lavorando a un problema simile e stavo mettendo la clausola WHERE prima di LEFT JOIN e stavo ottenendo un errore. Questo ha davvero aiutato. Grazie!
allardbrain

1
amico, sei una leggenda, proveniente dai panda in SQL e mi sono grattato la testa per un minuto caldo chiedendomi perché una query secondaria non avrebbe funzionato. Saluti.
Manakin

21

Riconosco che la risposta funziona ed è stata accettata, ma esiste un modo molto più pulito per scrivere quella query. Testato su 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
Salve, per interesse, questo metodo sarebbe più efficiente? In alternativa, sarebbe più efficiente spostare "AND wpp.meta_key = '_shipping_first_name'" nella clausola WHERE?
Chris

1
Onestamente, non ho idea di nessuno di questi. Ho appena trovato questa risposta e ho notato che c'era un modo più pulito per scrivere la query, quindi ho pensato di farlo notare. Mi dispiace di non poter essere più d'aiuto.
EJay

1
In MySQL / PostgreSQL puoi usare EXPLAIN SELECT ...o per MSSQL SET SHOWPLAN_ALL ONo SET SHOWPLAN_XML ONper vedere come vengono recuperate le righe. In MySQL used filesort, used temporarysono lenti e dovrebbero essere evitati. Per quanto riguarda la sottoquery unita, richiede il recupero di tutte le righe che corrispondono al valore meta_key dalla tabella wp_postmeta prima di unirsi agli ID di post / ordine. Quindi dovrebbe essere lecito ritenere che sarebbe più veloce abbinare l'ordine / ID post e meta_key. Generalmente una sottoquery come quella che hai usato è la migliore con una ORDER BY LIMITche non può essere filtrata dalla query principale.
Will B.

1
Esempi dai risultati di SQLFiddle: Criteria on Join sqlfiddle.com/#!2/e84fa/5 e Subquery on Join sqlfiddle.com/#!2/e84fa/3 Si noti che le Subquery on Join22 righe recuperate da wp_postmeta mentre l' Criteria on Joinunica recuperata 1 da wp_postmeta.
Will B.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.