Parece que está tratando de obtener un conjunto de resultados con una fila por publicación del tipo car . Parece que desea mostrar varios atributos de cada automóvil en la publicación, y esos están escondidos en postmeta .
Consejo profesional:Nunca usa SELECT * en el software a menos que sepa absolutamente por qué lo está haciendo. Especialmente con consultas que contienen muchos JOIN operaciones, SELECT * devuelve muchas columnas inútiles y redundantes.
Hay un truco de diseño de consultas para conocer el postmeta de WordPress mesa. Si desea obtener un atributo en particular, haga esto:
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 */
Es muy importante entender este patrón cuando haces lo que intentas hacer. Este patrón es obligatorio porque postmeta es un tipo peculiar de tabla llamada key-value
o entity-attribute-value
Tienda. ¿Que está pasando aqui? Algunas cosas:
- Usando este patrón obtienes una fila para cada publicación, con algunas columnas de las
poststabla y un atributo particular delpostmetamesa. - Eres
LEFT JOINing elpostmetatabla para que aún obtenga una fila si falta el atributo. - Está utilizando un nombre de alias para el
postmetamesa. Aquí estápostmeta AS color. - Estás incluyendo el selector para
meta_key(aquí es'color' = color.meta_key) en elONcondición de la unión. - Está utilizando un alias en su
SELECTcláusula para presentar elpostmeta.meta_valueelemento con un nombre de columna apropiado. Aquí estácolor.meta_value AS color.
Una vez que te acostumbres a emplear este patrón, puedes apilarlo con una cascada de LEFT JOIN operaciones, para obtener muchos atributos diferentes, así.
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
He hecho un montón de sangrado en esta consulta para que sea más fácil ver el patrón. Es posible que prefiera un estilo de sangría diferente.
Es difícil saber por qué tenía problemas de rendimiento con la consulta en su pregunta. Posiblemente se deba a que estabas obteniendo una explosión combinatoria con todas las INNER JOIN operaciones que luego se filtraron. Pero en cualquier caso, la consulta que mostró probablemente no devolvía filas.
Si aún tiene problemas de rendimiento, intente crear un índice compuesto en postmeta en el (post_id, meta_key, meta_value) columnas Si está creando un complemento de WordPress, probablemente sea un trabajo que debe hacer en el momento de la instalación del complemento.