SQL LEFT JOIN-Unterabfrage-Alias

84

Ich führe diese SQL-Abfrage aus:

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

Und ich bekomme diesen Fehler:

# 1054 - Unbekannte Spalte 'a.post_id' in 'on-Klausel'.

Ich denke, mein Code ist ziemlich einfach, aber ich kann es nicht richtig machen. Was mache ich falsch?

CharleyXIV
quelle

Antworten:

139

Sie haben post_idin der Unterabfrage nicht ausgewählt . Sie müssen es in der Unterabfrage wie folgt auswählen:

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 
Mahmoud Gamal
quelle
1
Ich danke dir sehr! Ich arbeite an einem ähnlichen Problem und habe die WHERE-Klausel vor LEFT JOIN gestellt und einen Fehler erhalten. Das hat wirklich geholfen. Vielen Dank!
Allardbrain
1
Kumpel, du bist eine Legende, kommst von Pandas in SQL und ich kratzte mir eine heiße Minute am Kopf und fragte mich, warum eine Unterabfrage nicht funktionieren würde. Prost.
Manakin
21

Ich erkenne, dass die Antwort funktioniert und akzeptiert wurde, aber es gibt eine viel sauberere Möglichkeit, diese Abfrage zu schreiben. Getestet auf MySQL und 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
quelle
1
Hallo, wäre diese Methode aus Interesse effizienter? Alternativ wäre es effizienter, das "AND wpp.meta_key = '_shipping_first_name'" in die WHERE-Klausel zu verschieben?
Chris
1
Ehrlich gesagt habe ich keine Ahnung davon. Ich bin gerade auf diese Antwort gestoßen und habe festgestellt, dass es eine sauberere Möglichkeit gibt, die Abfrage zu schreiben, also dachte ich mir, ich würde darauf hinweisen. Entschuldigung, ich kann Ihnen nicht weiterhelfen.
EJay
1
In MySQL / PostgreSQL können Sie EXPLAIN SELECT ...oder für MSSQL verwenden SET SHOWPLAN_ALL ONoder SET SHOWPLAN_XML ONsehen, wie Zeilen abgerufen werden. In MySQL used filesort, used temporarysind langsam und sollten vermieden werden. Für die verknüpfte Unterabfrage müssen alle Zeilen, die mit dem Wert meta_key übereinstimmen, aus der Tabelle wp_postmeta abgerufen werden, bevor die IDs für Post / Order verknüpft werden. Es sollte also sicher sein, dass es schneller ist, die Bestell- / Post-IDs und den Meta-Schlüssel abzugleichen. Im Allgemeinen eignet sich eine Unterabfrage wie die von Ihnen verwendete am besten für eine ORDER BY LIMIT, die nicht aus der Hauptabfrage herausgefiltert werden kann.
Fyrye
1
Beispiele aus SQLFiddle-Ergebnissen: Criteria on Join sqlfiddle.com/#!2/e84fa/5 und Subquery on Join sqlfiddle.com/#!2/e84fa/3 Beachten Sie, dass Subquery on Join22 Zeilen aus wp_postmeta Criteria on Joinabgerufen wurden, während nur 1 aus wp_postmeta abgerufen wurde.
Fyrye