Det verkar som om du försöker få en resultatuppsättning med en rad per post av typen car
. Det verkar som om du vill visa olika attribut för varje bil i inlägget, och de är gömda i postmeta
.
Proffstips:Aldrig använd SELECT *
i programvara om du inte absolut vet varför du gör det. Speciellt med frågor som innehåller många JOIN
operationer, SELECT *
returnerar massor av meningslösa och redundanta kolumner.
Det finns ett frågedesigntrick att känna till för WordPress postmeta
tabell. Om du vill få ett visst attribut, gör så här:
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 är superviktigt att förstå detta mönster när du gör det du försöker göra. Detta mönster krävs eftersom postmeta
är en speciell typ av tabell som kallas ett nyckel-värde
eller entity-attribute-value
Lagra. Vad händer här? Några saker:
- Med det här mönstret får du en rad för varje inlägg, med några kolumner från
posts
tabell och ett visst attribut frånpostmeta
tabell. - Du är
LEFT JOIN
genom att användapostmeta
tabell så att du fortfarande får en rad om attributet saknas. - Du använder ett aliasnamn för
postmeta
tabell. Här är detpostmeta AS color
. - Du inkluderar väljaren för
meta_key
(här är det'color' = color.meta_key
) iON
skick för sammanfogningen. - Du använder ett alias i din
SELECT
sats för att presenterapostmeta.meta_value
objekt med ett lämpligt kolumnnamn. Här är detcolor.meta_value AS color
.
När du väl har vant dig vid att använda det här mönstret kan du stapla det med en kaskad av LEFT JOIN
operationer, för att få massor av olika attribut, som så.
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
Jag har gjort ett gäng indrag på den här frågan för att göra det lättare att se mönstret. Du kanske föredrar en annan indragsstil.
Det är svårt att veta varför du hade prestandaproblem med frågan i din fråga. Det är möjligen för att du fick en kombinatorisk explosion med alla INNER JOIN
operationer som sedan filtrerades. Men i vilket fall som helst returnerade frågan du visade förmodligen inga rader.
Om du fortfarande har problem med prestanda, försök skapa ett sammansatt index på postmeta
på (post_id, meta_key, meta_value)
kolumner. Om du skapar ett WordPress-plugin är det förmodligen ett jobb att göra vid installationen av plugin.