SQL LEFT JOIN Subquery Alias


91

Bu SQL sorgusunu çalıştırıyorum:

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

Ve şu hatayı alıyorum:

# 1054 - 'on cümlesinde' bilinmeyen 'a.post_id' sütunu.

Kodumun oldukça basit olduğunu düşünüyorum, ancak bunu düzeltemiyorum. Neyi yanlış yapıyorum?

Yanıtlar:


151

post_idAlt sorguda seçim yapmadınız . Bunu alt sorguda şu şekilde seçmelisiniz:

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
Çok teşekkür ederim! Benzer bir sorun üzerinde çalışıyorum ve WHERE cümlesini LEFT JOIN'in önüne koyuyordum ve bir hata alıyordum. Bu gerçekten yardımcı oldu. Teşekkürler!
allardbrain

1
dostum, sen bir efsanesin, pandalardan SQL'e geliyorsun ve bir alt sorgunun neden işe yaramayacağını merak ediyordum. şerefe.
Manakin

21

Cevabın işe yaradığını ve kabul edildiğini biliyorum, ancak bu sorguyu yazmanın çok daha net bir yolu var. Mysql ve postgres üzerinde test edilmiştir.

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
Merhaba, İlgi dışı, bu yöntem daha verimli olur mu? Alternatif olarak "AND wpp.meta_key = '_shipping_first_name'" öğesini WHERE yan tümcesine taşımak daha verimli olur mu?
Chris

1
Açıkçası, bunlardan hiçbiri hakkında hiçbir fikrim yok. Bu yanıta yeni rastladım ve sorguyu yazmanın daha temiz bir yolu olduğunu fark ettim, bu yüzden bunu belirteceğimi düşündüm. Üzgünüm daha fazla yardımcı olamam.
EJay

1
MySQL / PostgreSQL'de EXPLAIN SELECT ..., MSSQL için SET SHOWPLAN_ALL ONveya kullanabilir veya SET SHOWPLAN_XML ONsatırların nasıl alındığını görebilirsiniz. MySQL used filesort, used temporaryyavaş ve kaçınılmalıdır. Birleştirilen alt sorgu için, post / order id'lerine katılmadan önce wp_postmeta tablosundan meta_key değeriyle eşleşen tüm satırların alınmasını gerektirir. Bu nedenle, sipariş / gönderi kimlikleri ve meta_key ile eşleşmenin daha hızlı olacağını varsaymak güvenli olmalıdır. Genel olarak, kullandığınız gibi bir alt sorgu ORDER BY LIMIT, ana sorgudan filtrelenemeyen bir alt sorgu ile en iyisidir .
Will B.

1
: SQLFiddle sonuçları örnekler Criteria on Join sqlfiddle.com/#!2/e84fa/5 ve Subquery on Join sqlfiddle.com/#!2/e84fa/3 olduğu not Subquery on Joinise wp_postmeta 22 satır alınan Criteria on Jointek wp_postmeta den 1 erişmiştir.
Will B.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.