SQL LEFT JOIN นามแฝงการสืบค้นย่อย


91

ฉันกำลังเรียกใช้แบบสอบถาม 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' ใน 'ในประโยค'

ฉันคิดว่ารหัสของฉันค่อนข้างเรียบง่าย แต่ฉันทำไม่ถูก ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


151

คุณไม่ได้เลือก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 และฉันเกาหัวของฉันเป็นนาทีที่ร้อนใจสงสัยว่าทำไมแบบสอบถามย่อยไม่ทำงาน ไชโย
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 

1
สวัสดีวิธีนี้จะมีประสิทธิภาพมากกว่านี้ไหม อีกวิธีหนึ่งจะมีประสิทธิภาพมากกว่าในการย้าย "AND wpp.meta_key = '_shipping_first_name'" ไปยัง WHERE clause?
Chris

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ข้อมูล 22 แถวจาก wp_postmeta ในขณะที่Criteria on Joinข้อมูลเพียง 1 ที่ดึงมาจาก wp_postmeta
Will B.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.