2013-05-27 4 views
43

Я бегу этот SQL-запрос:SQL LEFT JOIN Subquery Алиас

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 - Unknown column 'a.post_id' in 'on clause'.

Я думаю, что мой код очень прост, но я не могу сделать это правильно. Что я делаю не так?

ответ

73

Вы не выбрали 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 
+0

Большое вам спасибо! Я работаю над подобной проблемой и ставил предложение WHERE перед LEFT JOIN и получал ошибку. Это действительно помогло. Благодаря! – allardbrain

14

Я признаю, что работы ответа и были приняты, но есть более простой способ, чтобы написать этот запрос. Протестировано на 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 
+0

Привет, Из интереса, будет ли этот метод более эффективным? В качестве альтернативы было бы более эффективно перемещать «AND wpp.meta_key =« _shipping_first_name »в предложение WHERE? – Chris

+0

Честно говоря, я понятия не имею об этом. Я просто наткнулся на этот ответ и заметил, что есть более чистый способ написать запрос, поэтому я решил, что я укажу это. Извините, я не могу больше помочь. – EJay

+0

В MySQL/PostgreSQL вы можете использовать 'EXPLAIN SELECT ...' или для MSSQL 'SET SHOWPLAN_ALL ON' или' SET SHOWPLAN_XML ON', чтобы узнать, как извлекаются строки. В MySQL 'used filesort',' used tempor' медленны и их следует избегать. Что касается объединенного подзапроса, он требует получить все строки, соответствующие значению meta_key из таблицы wp_postmeta, перед присоединением к идентификатору post/order. Поэтому следует с уверенностью предположить, что было бы быстрее сопоставлять идентификаторы order/post id и meta_key. Как правило, подзапрос, подобный тому, который вы использовали, лучше всего с 'ORDER BY'' LIMIT', который нельзя отфильтровать из основного запроса. – fyrye