ChatGPT解决这个技术问题 Extra ChatGPT

SQL LEFT JOIN Subquery Alias

I'm running this SQL query:

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

And I get this error:

#1054 - Unknown column 'a.post_id' in 'on clause'.

I think my code is pretty simple, but I can't make it right. What am I doing wrong?


M
Mahmoud Gamal

You didn't select post_id in the subquery. You have to select it in the subquery like this:

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 

Thank you so much! I am working on a similar problem and was putting the WHERE clause before the LEFT JOIN and was getting an error. This really helped. Thanks!
mate, you are a legend, coming from pandas into SQL and i was scratching my head for a hot minute wondering why a sub query wouldn't work. cheers.
E
EJay

I recognize that the answer works and has been accepted but there is a much cleaner way to write that query. Tested on mysql and 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 

Hi, Out of interest, would this method be more efficient? Alternatively would it be more efficient to move the "AND wpp.meta_key = '_shipping_first_name'" to the WHERE clause?
Honestly, I have no idea on either of those. I just came across this answer and noticed that there was cleaner way to write the query so I figured I would point that out. Sorry I can't be of more help.
In MySQL/PostgreSQL you can use EXPLAIN SELECT ... or for MSSQL SET SHOWPLAN_ALL ON or SET SHOWPLAN_XML ON to see how rows are retrieved. In MySQL used filesort, used temporary are slow and should be avoided. As for the joined subquery, it requires retrieving all rows matching the meta_key value from the wp_postmeta table before joining on post/order id's. So it should be safe to assume that it would be faster to match on the order/post id's and meta_key. Generally a subquery like the one you used is best with an ORDER BY LIMIT that can't be filtered from the main query.
Examples from SQLFiddle results: Criteria on Join sqlfiddle.com/#!2/e84fa/5 and Subquery on Join sqlfiddle.com/#!2/e84fa/3 Note that the Subquery on Join retrieved 22 rows from wp_postmeta while the Criteria on Join only retrieved 1 from wp_postmeta.