SQL LEFT JOIN Alias ​​podzapytania

87

Uruchamiam to zapytanie 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

I otrzymuję ten błąd:

# 1054 - Nieznana kolumna „a.post_id” w „klauzuli on”.

Myślę, że mój kod jest dość prosty, ale nie mogę tego naprawić. Co ja robię źle?

CharleyXIV
źródło

Odpowiedzi:

146

Nie wybrałeś post_idw podzapytaniu. Musisz go zaznaczyć w podzapytaniu w następujący sposób:

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
źródło
1
Dziękuję bardzo! Pracuję nad podobnym problemem i umieszczałem klauzulę WHERE przed LEFT JOIN i otrzymywałem błąd. To naprawdę pomogło. Dzięki!
allardbrain
1
kolego, jesteś legendą, przechodzisz z pand do SQL i drapałem się po głowie przez gorącą minutę, zastanawiając się, dlaczego zapytanie podrzędne nie działa. Twoje zdrowie.
Manakin
21

Rozumiem, że odpowiedź działa i została zaakceptowana, ale istnieje znacznie bardziej przejrzysty sposób napisania tego zapytania. Testowane na mysql i 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
źródło
1
Cześć, poza zainteresowaniem, czy ta metoda byłaby bardziej wydajna? Alternatywnie, czy bardziej wydajne byłoby przeniesienie „AND wpp.meta_key = '_shipping_first_name'” do klauzuli WHERE?
Chris,
1
Szczerze mówiąc, nie mam pojęcia o żadnej z nich. Właśnie natknąłem się na tę odpowiedź i zauważyłem, że istnieje czystszy sposób na napisanie zapytania, więc pomyślałem, że zwrócę na to uwagę. Przepraszam, nie mogę być bardziej pomocny.
EJay
1
W MySQL / PostgreSQL możesz użyć EXPLAIN SELECT ...lub dla MSSQL SET SHOWPLAN_ALL ONlub SET SHOWPLAN_XML ONzobaczyć, jak pobierane są wiersze. W MySQL used filesort, used temporarysą powolne i należy ich unikać. Jeśli chodzi o połączone podzapytanie, wymaga pobrania wszystkich wierszy pasujących do wartości meta_key z tabeli wp_postmeta przed dołączeniem do identyfikatorów postu / zamówienia. Dlatego należy bezpiecznie założyć, że szybciej byłoby dopasować identyfikator zamówienia / posta i meta_key. Generalnie podzapytanie, takie jak użyte, jest najlepsze z ORDER BY LIMITzapytaniem, którego nie można odfiltrować z zapytania głównego.
Will B.
1
Przykłady z wyników SQLFiddle: Criteria on Join sqlfiddle.com/#!2/e84fa/5 i Subquery on Join sqlfiddle.com/#!2/e84fa/3 Zauważ, że Subquery on Joinpobrano 22 wiersze z wp_postmeta, podczas gdy Criteria on Joinjedyny pobrano 1 z wp_postmeta.
Will B.