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.