J'exécute cette requête 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
Et j'obtiens cette erreur:
# 1054 - Colonne inconnue 'a.post_id' dans 'on clause'.
Je pense que mon code est assez simple, mais je ne peux pas le faire correctement. Qu'est-ce que je fais mal?
Je reconnais que la réponse fonctionne et a été acceptée, mais il existe une manière beaucoup plus propre d'écrire cette requête. Testé sur mysql et 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
la source
EXPLAIN SELECT ...
ou pour MSSQLSET SHOWPLAN_ALL ON
ouSET SHOWPLAN_XML ON
pour voir comment les lignes sont récupérées. Dans MySQLused filesort
,used temporary
sont lents et doivent être évités. Quant à la sous-requête jointe, elle nécessite de récupérer toutes les lignes correspondant à la valeur meta_key de la table wp_postmeta avant de rejoindre les identifiants de publication / commande. Il devrait donc être prudent de supposer qu'il serait plus rapide de faire correspondre les identifiants de commande / post et meta_key. En général, une sous-requête comme celle que vous avez utilisée est préférable avec uneORDER BY
LIMIT
qui ne peut pas être filtrée de la requête principale.Criteria on Join
sqlfiddle.com/#!2/e84fa/5 etSubquery on Join
sqlfiddle.com/#!2/e84fa/3 Notez que lesSubquery on Join
22 lignes récupérées de wp_postmeta tandis que leCriteria on Join
seul extrait 1 de wp_postmeta.