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?

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 

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 

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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.