SQL LEFTJOINサブクエリエイリアス


87

私はこの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

そして、私はこのエラーを受け取ります:

#1054-'on句 'の不明な列' a.post_id '。

私のコードはかなり単純だと思いますが、正しくすることはできません。私は何が間違っているのですか?

回答:


144

post_idサブクエリで選択しませんでした。次のようにサブクエリで選択する必要があります。

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
どうもありがとうございます!私は同様の問題に取り組んでおり、LEFT JOINの前にWHERE句を配置していて、エラーが発生していました。これは本当に役に立ちました。ありがとう!
allardbrain 2017年

1
メイト、あなたは伝説で、パンダからSQLにやって来て、サブクエリが機能しない理由を考えて頭を悩ませていました。乾杯。
マナキン

21

私は答えが機能し、受け入れられたことを認識していますが、そのクエリを書くためのはるかにクリーンな方法があります。mysqlと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
こんにちは、興味深いことに、この方法はより効率的でしょうか?あるいは、「AND wpp.meta_key = '_ shipping_first_name'」をWHERE句に移動する方が効率的でしょうか。
クリス

1
正直なところ、どちらもわかりません。私はちょうどこの答えに出くわし、クエリを書くためのよりクリーンな方法があることに気づいたので、私はそれを指摘すると思いました。申し訳ありませんが、これ以上お役に立てることはありません。
EJay 2014

1
MySQL / PostgreSQLではEXPLAIN SELECT ...、MSSQLを使用するか、行がどのように取得されるSET SHOWPLAN_ALL ONSET SHOWPLAN_XML ONを確認できます。MySQLused filesortではused temporary、速度が遅いため、避ける必要があります。結合されたサブクエリの場合、投稿/注文IDで結合する前に、wp_postmetaテーブルからmeta_key値に一致するすべての行を取得する必要があります。したがって、注文/投稿IDとmeta_keyで一致する方が速いと想定するのが安全です。一般に、使用したようなサブクエリはORDER BY LIMIT、メインクエリからフィルタリングできないサブクエリが最適です。
ウィルB.

1
SQLFiddleの結果の例:Criteria on Join sqlfiddle.com / Subquery on Join !2 / e84fa / 5およびsqlfiddle.com/#!2/e84fa/3 wp_postmetaSubquery on Joinから22行をCriteria on Join取得しましたが、wp_postmetaから1行のみを取得したことに注意してください。
ウィルB.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.