SQL ЛІВО ПРИЄДНАЙТЕСЬ Псевдонім підзапиту


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".

Я думаю, що мій код досить простий, але я не можу зробити це правильно. Що я роблю не так?

Відповіді:


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

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

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який не можна відфільтрувати з основного запиту.
Will B.

1
Приклади результатів SQLFiddle: Criteria on Join sqlfiddle.com/#!2/e84fa/5 та Subquery on Join sqlfiddle.com/#!2/e84fa/3 Зверніть увагу, що Subquery on Join22 рядки отримано з wp_postmeta, тоді як Criteria on Join1 отримано з wp_postmeta.
Will B.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.