Псевдоним подзапроса SQL LEFT JOIN

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 - Неизвестный столбец 'a.post_id' в 'on clause'.

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

ЧарлиXIV
источник

Ответы:

146

Вы не выбрали 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
Спасибо огромное! Я работаю над аналогичной проблемой и помещал предложение WHERE перед LEFT JOIN и получал ошибку. Это действительно помогло. Благодарность!
allardbrain 06
1
приятель, ты легенда, перешедшая из панд в SQL, и я горячую минуту чесал затылок, гадая, почему подзапрос не работает. ура.
Manakin
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 
EJay
источник
1
Привет, из интереса, может ли этот метод быть более эффективным? В качестве альтернативы было бы более эффективным переместить «AND wpp.meta_key = '_shipping_first_name'» в предложение WHERE?
Крис
1
Честно говоря, я понятия не имею ни об одном из них. Я только что наткнулся на этот ответ и заметил, что есть более чистый способ написать запрос, поэтому я решил, что укажу на это. Извините, я ничем не могу больше помочь.
EJay
1
В MySQL / PostgreSQL вы можете использовать EXPLAIN SELECT ...или для MSSQL SET SHOWPLAN_ALL ONили SET SHOWPLAN_XML ONпосмотреть, как извлекаются строки. В MySQL used filesort, used temporaryмедленно и следует избегать. Что касается объединенного подзапроса, он требует извлечения всех строк, соответствующих значению meta_key, из таблицы wp_postmeta перед присоединением по идентификаторам публикации / заказа. Таким образом, можно с уверенностью предположить, что будет быстрее соответствовать идентификатору заказа / публикации и meta_key. Как правило, лучше всего использовать подзапрос, подобный тому, который вы использовали, с тем, ORDER BY LIMITчто его нельзя отфильтровать из основного запроса.
Уилл Б.
1
Примеры из результатов SQLFiddle: Criteria on Join sqlfiddle.com/#!2/e84fa/5 и Subquery on Join sqlfiddle.com/#!2/e84fa/3 Обратите внимание, что Subquery on Joinиз wp_postmeta было получено 22 строки, а из wp_postmeta была получена Criteria on Joinтолько одна.
Уилл Б.