SQL LEFT JOIN Bí danh truy vấn con


87

Tôi đang chạy truy vấn SQL này:

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

Và tôi gặp lỗi này:

# 1054 - Cột không xác định 'a.post_id' trong 'trên mệnh đề'.

Tôi nghĩ mã của tôi khá đơn giản, nhưng tôi không thể làm cho nó đúng. Tôi đang làm gì sai?

Câu trả lời:


144

Bạn đã không chọn post_idtrong truy vấn phụ. Bạn phải chọn nó trong truy vấn con như sau:

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
Cảm ơn bạn rất nhiều! Tôi đang giải quyết một vấn đề tương tự và đang đặt mệnh đề WHERE trước LEFT JOIN và gặp lỗi. Điều này thực sự hữu ích. Cảm ơn!
allardbrain

1
bạn đời, bạn là một huyền thoại, đến từ gấu trúc vào SQL và tôi đã vò đầu bứt tai trong một phút nóng nảy tự hỏi tại sao một truy vấn phụ không hoạt động. hoan hô.
Manakin

21

Tôi nhận ra rằng câu trả lời hoạt động và đã được chấp nhận nhưng có một cách rõ ràng hơn nhiều để viết truy vấn đó. Đã thử nghiệm trên mysql và 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
Xin chào, Không quan tâm, phương pháp này có hiệu quả hơn không? Ngoài ra, sẽ hiệu quả hơn nếu di chuyển "AND wpp.meta_key = '_shipping_first_name'" sang mệnh đề WHERE?
Chris

1
Thành thật mà nói, tôi không có ý tưởng về một trong hai điều đó. Tôi vừa xem qua câu trả lời này và nhận thấy rằng có cách viết truy vấn rõ ràng hơn nên tôi nghĩ rằng tôi sẽ chỉ ra điều đó. Xin lỗi, tôi không thể giúp được gì nhiều hơn.
EJay

1
Trong MySQL / PostgreSQL, bạn có thể sử dụng EXPLAIN SELECT ...hoặc cho MSSQL SET SHOWPLAN_ALL ONhoặc SET SHOWPLAN_XML ONđể xem các hàng được truy xuất như thế nào. Trong MySQL used filesort, used temporarychậm và nên tránh. Đối với truy vấn con đã tham gia, nó yêu cầu truy xuất tất cả các hàng khớp với giá trị meta_key từ bảng wp_postmeta trước khi tham gia vào id của post / order. Vì vậy, nên an toàn khi cho rằng sẽ nhanh hơn nếu khớp trên id của đơn hàng / bài đăng và meta_key. Nói chung, một truy vấn con giống như truy vấn bạn đã sử dụng là tốt nhất với một ORDER BY LIMITtruy vấn không thể lọc khỏi truy vấn chính.
Will B.

1
Ví dụ từ kết quả SQLFiddle: Criteria on Join sqlfiddle.com/#!2/e84fa/5Subquery on Join sqlfiddle.com/#!2/e84fa/3 Lưu ý rằng Subquery on Join22 hàng được truy xuất từ ​​wp_postmeta trong khi hàng Criteria on Joinduy nhất được truy xuất 1 từ wp_postmeta.
Will B.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.