Det ser ud til, at du forsøger at opnå et resultatsæt med én række pr. post af typen car
. Det ser ud til, at du ønsker at vise forskellige egenskaber for hver bil i posten, og disse er gemt væk i postmeta
.
Professionelt tip:Aldrig brug SELECT *
i software, medmindre du absolut ved, hvorfor du gør det. Især med forespørgsler, der indeholder masser af JOIN
operationer, SELECT *
returnerer masser af meningsløse og overflødige kolonner.
Der er et forespørgselsdesigntrick at kende til WordPress postmeta
bord. Hvis du vil have en bestemt egenskab, skal du gøre dette:
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 */
Det er supervigtigt at forstå dette mønster, når du gør det, du prøver at gøre. Dette mønster er påkrævet, fordi postmeta
er en ejendommelig type tabel kaldet en nøgleværdi
eller entity-attribute-value
butik. Hvad sker der her? Et par ting:
- Ved at bruge dette mønster får du en række for hvert indlæg med nogle kolonner fra
posts
tabel og en bestemt attribut frapostmeta
tabel. - Du er
LEFT JOIN
ved at brugepostmeta
tabel, så du stadig får en række, hvis attributten mangler. - Du bruger et aliasnavn til
postmeta
bord. Her er detpostmeta AS color
. - Du inkluderer vælgeren for
meta_key
(her er det'color' = color.meta_key
) iON
sammenføjningens tilstand. - Du bruger et alias i din
SELECT
klausul for at præsenterepostmeta.meta_value
element med et passende kolonnenavn. Her er detcolor.meta_value AS color
.
Når du har vænnet dig til at bruge dette mønster, kan du stable det op med en kaskade af LEFT JOIN
operationer, for at få mange forskellige attributter, f.eks.
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
Jeg har lavet en masse indrykning på denne forespørgsel for at gøre det nemmere at se mønsteret. Du foretrækker måske en anden indrykningsstil.
Det er svært at vide, hvorfor du havde problemer med ydeevnen med forespørgslen i dit spørgsmål. Det er muligvis fordi du fik en kombinatorisk eksplosion med alle de INNER JOIN
operationer, der derefter blev filtreret. Men i hvert fald returnerede den forespørgsel, du viste, sandsynligvis ingen rækker.
Hvis du stadig har problemer med ydeevnen, så prøv at oprette et sammensat indeks på postmeta
på (post_id, meta_key, meta_value)
kolonner. Hvis du opretter et WordPress-plugin, er det sandsynligvis et job, du skal udføre ved installation af plugin.