sql >> Base de Datos >  >> RDS >> Mysql

Mejorar una consulta usando muchas uniones internas a wp_postmeta, una tabla clave/valor

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 o Tienda. ¿Que está pasando aqui? Algunas cosas:

  1. Usando este patrón obtienes una fila para cada publicación, con algunas columnas de las posts tabla y un atributo particular del postmeta mesa.
  2. Eres LEFT JOIN ing el postmeta tabla para que aún obtenga una fila si falta el atributo.
  3. Está utilizando un nombre de alias para el postmeta mesa. Aquí está postmeta AS color .
  4. Estás incluyendo el selector para meta_key (aquí es 'color' = color.meta_key ) en el ON condición de la unión.
  5. Está utilizando un alias en su SELECT cláusula para presentar el postmeta.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.