Parece que você está tentando obter um conjunto de resultados com uma linha por postagem do tipo
car . Parece que você deseja exibir vários atributos de cada carro no post, e eles estão guardados em postmeta . Dica profissional:Nunca use
SELECT * em software, a menos que você saiba absolutamente por que está fazendo isso. Especialmente com consultas contendo muitos JOIN operações, SELECT * retorna muitas colunas inúteis e redundantes. Há um truque de design de consulta para o WordPress
postmeta tabela. Se você deseja obter um atributo específico, faça o seguinte: 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 */
É muito importante entender esse padrão ao fazer o que você está tentando fazer. Este padrão é necessário porque
postmeta é um tipo peculiar de tabela chamado key-value
ou entity-attribute-value
armazenar. O que está acontecendo aqui? Algumas coisas:- Usando este padrão você obtém uma linha para cada postagem, com algumas colunas das
poststabela e um atributo específico dopostmetatabela. - Você está
LEFT JOINndo opostmetatable para que você ainda receba uma linha se o atributo estiver ausente. - Você está usando um nome alternativo para o
postmetatabela. Aqui estápostmeta AS color. - Você está incluindo o seletor para
meta_key(aqui está'color' = color.meta_key) noONcondição da associação. - Você está usando um alias em seu
SELECTcláusula para apresentar opostmeta.meta_valueitem com um nome de coluna apropriado. Aqui estácolor.meta_value AS color.
Depois de se acostumar a empregar esse padrão, você pode empilhá-lo, com uma cascata de
LEFT JOIN operações, para obter muitos atributos diferentes, assim. 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
Eu fiz um monte de recuo nesta consulta para facilitar a visualização do padrão. Você pode preferir um estilo de recuo diferente.
É difícil saber por que você estava tendo problemas de desempenho com a consulta em sua pergunta. É possivelmente porque você estava recebendo uma explosão combinatória com todos os
INNER JOIN operações que foram então filtradas. Mas, de qualquer forma, a consulta que você mostrou provavelmente não estava retornando nenhuma linha. Se você ainda estiver tendo problemas de desempenho, tente criar um índice composto em
postmeta no (post_id, meta_key, meta_value) colunas. Se você estiver criando um plug-in do WordPress, isso provavelmente é um trabalho a ser feito no momento da instalação do plug-in.