Il semble que vous essayez d'obtenir un ensemble de résultats avec une ligne par article de type car . Il semble que vous souhaitiez afficher divers attributs de chaque voiture dans le message, et ceux-ci sont cachés dans postmeta .
Conseil de pro :Jamais utilisez SELECT * dans le logiciel à moins que vous ne sachiez absolument pourquoi vous le faites. Surtout avec des requêtes contenant beaucoup de JOIN opérations, SELECT * renvoie beaucoup de colonnes inutiles et redondantes.
Il y a une astuce de conception de requête à connaître pour le WordPress postmeta table. Si vous souhaitez obtenir un attribut particulier, procédez comme suit :
SELECT p.ID, p.post_title,
color.meta_value AS color
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS color ON p.ID = color.post_id AND 'color' = color.meta_key
WHERE p.post_status = 'publish'
AND /* etc etc */
Il est très important de comprendre ce modèle lorsque vous faites ce que vous essayez de faire. Ce modèle est requis car postmeta est un type de tableau particulier appelé key-value
ou entity-attribute-value
boutique. Que se passe t-il ici? Quelques éléments :
- En utilisant ce modèle, vous obtenez une ligne pour chaque message, avec quelques colonnes des
poststable et un attribut particulier dupostmetatableau. - Vous êtes
LEFT JOINlepostmetatable afin que vous obteniez toujours une ligne si l'attribut est manquant. - Vous utilisez un nom d'alias pour le
postmetatable. Ici, c'est lapostmeta AS color. - Vous incluez le sélecteur pour
meta_key(ici c'est'color' = color.meta_key) dans leONcondition de la jointure. - Vous utilisez un alias dans votre
SELECTclause pour présenter lepostmeta.meta_valueélément avec un nom de colonne approprié. Ici c'estcolor.meta_value AS color.
Une fois que vous vous êtes habitué à utiliser ce modèle, vous pouvez l'empiler, avec une cascade de LEFT JOIN opérations, pour obtenir de nombreux attributs différents, comme ceci.
SELECT wp_posts.ID, wp_posts.post_title, wp_posts.whatever,
color.meta_value AS color,
transmission.meta_value AS transmission,
model.meta_value AS model,
brand.meta_value AS brand
FROM wp_posts
LEFT JOIN wp_postmeta AS color
ON wp_posts.ID = color.post_id AND color.meta_key='color'
LEFT JOIN wp_postmeta AS transmission
ON wp_posts.ID = transmission.post_id AND transmission.meta_key='transmission'
LEFT JOIN wp_postmeta AS model
ON wp_posts.ID = model.post_id AND model.meta_key='model'
LEFT JOIN wp_postmeta AS brand
ON wp_posts.ID = brand.post_id AND brand.meta_key='brand'
WHERE wp_posts.post_status = 'publish'
AND wp_posts.post_type = 'car'
ORDER BY wp_posts.post_title
J'ai fait un tas d'indentation sur cette requête pour faciliter la visualisation du modèle. Vous pouvez préférer un style d'indentation différent.
Il est difficile de savoir pourquoi vous aviez des problèmes de performances avec la requête dans votre question. C'est peut-être parce que vous obteniez une explosion combinatoire avec tous les INNER JOIN opérations qui ont ensuite été filtrées. Mais dans tous les cas, la requête que vous avez montrée ne renvoyait probablement aucune ligne.
Si vous rencontrez toujours des problèmes de performances, essayez de créer un index composé sur postmeta sur le (post_id, meta_key, meta_value) Colonnes. Si vous créez un plugin WordPress, c'est probablement un travail à faire au moment de l'installation du plugin.