SQL LEFT JOIN Subquery Alias

91

Saya menjalankan kueri SQL ini:

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

Dan saya mendapatkan kesalahan ini:

# 1054 - Kolom tidak diketahui 'a.post_id' di 'pada klausa'.

Saya pikir kode saya cukup sederhana, tetapi saya tidak bisa membuatnya benar. Apa yang saya lakukan salah?

CharleyXIV
sumber

Jawaban:

151

Anda tidak memilih post_iddi subkueri. Anda harus memilihnya di subkueri seperti ini:

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
sumber
1
Terima kasih banyak! Saya sedang mengerjakan masalah yang serupa dan meletakkan klausa WHERE sebelum LEFT JOIN dan mendapatkan kesalahan. Ini sangat membantu. Terima kasih!
allardbrain
1
sobat, Anda adalah seorang legenda, datang dari panda ke SQL dan saya menggaruk-garuk kepala saya selama beberapa menit bertanya-tanya mengapa sub query tidak berfungsi. Bersulang.
Manakin
21

Saya menyadari bahwa jawabannya berfungsi dan telah diterima, tetapi ada cara yang jauh lebih bersih untuk menulis kueri itu. Diuji di mysql dan 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
sumber
1
Hai, Karena tertarik, apakah metode ini akan lebih efisien? Atau, apakah akan lebih efisien untuk memindahkan "AND wpp.meta_key = '_shipping_first_name'" ke klausa WHERE?
Chris
1
Sejujurnya, saya tidak tahu apa-apa tentang itu. Saya baru saja menemukan jawaban ini dan memperhatikan bahwa ada cara yang lebih bersih untuk menulis kueri jadi saya pikir saya akan menunjukkannya. Maaf saya tidak bisa lebih membantu.
EJay
1
Di MySQL / PostgreSQL Anda dapat menggunakan EXPLAIN SELECT ...atau untuk MSSQL SET SHOWPLAN_ALL ONatau SET SHOWPLAN_XML ONuntuk melihat bagaimana baris diambil. Di MySQL used filesort, used temporarylambat dan harus dihindari. Sedangkan untuk subkueri yang digabungkan, dibutuhkan pengambilan semua baris yang cocok dengan nilai meta_key dari tabel wp_postmeta sebelum bergabung pada id post / order. Jadi semestinya aman untuk berasumsi bahwa akan lebih cepat mencocokkan id order / post dan meta_key. Umumnya subkueri seperti yang Anda gunakan paling baik dengan ORDER BY LIMITyang tidak dapat difilter dari kueri utama.
Akan B.
1
Contoh dari hasil SQLFiddle: Criteria on Join sqlfiddle.com/#!2/e84fa/5 dan Subquery on Join sqlfiddle.com/#!2/e84fa/3 Perhatikan bahwa Subquery on Join22 baris diambil dari wp_postmeta sedangkan Criteria on Joinhanya 1 yang diambil dari wp_postmeta.
Akan B.