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
posts
tabla y un atributo particular delpostmeta
mesa. - Eres
LEFT JOIN
ing elpostmeta
tabla para que aún obtenga una fila si falta el atributo. - Está utilizando un nombre de alias para el
postmeta
mesa. Aquí estápostmeta AS color
. - Estás incluyendo el selector para
meta_key
(aquí es'color' = color.meta_key
) en elON
condición de la unión. - Está utilizando un alias en su
SELECT
cláusula para presentar elpostmeta.meta_value
elemento 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.