Zdá se, že se pokoušíte získat sadu výsledků s jedním řádkem na příspěvek typu car
. Zdá se, že chcete v příspěvku zobrazit různé atributy každého auta a ty jsou schované v postmeta
.
Tip pro profesionály:Nikdy použijte SELECT *
v softwaru, pokud absolutně nevíte, proč to děláte. Zejména u dotazů obsahujících mnoho JOIN
operace, SELECT *
vrátí spoustu zbytečných a nadbytečných sloupců.
Pro postmeta
WordPressu je potřeba znát trik pro návrh dotazů stůl. Pokud chcete získat konkrétní atribut, udělejte toto:
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 */
Je velmi důležité pochopit tento vzorec, když děláte to, o co se snažíte. Tento vzor je povinný, protože postmeta
je zvláštní typ tabulky zvaný pár klíč-hodnota
nebo entity-attribute-value
ukládat. Co se tam děje? Pár věcí:
- Pomocí tohoto vzoru získáte jeden řádek pro každý příspěvek s několika sloupci z
posts
tabulka a konkrétní atribut zpostmeta
stůl. - Jste
LEFT JOIN
vpostmeta
tabulka, takže stále získáte řádek, pokud atribut chybí. - Používáte alias pro
postmeta
stůl. Zde jepostmeta AS color
. - Zahrnujete selektor pro
meta_key
(zde je to'color' = color.meta_key
) vON
podmínkou připojení. - Ve
SELECT
používáte alias klauzule k prezentacipostmeta.meta_value
položka s příslušným názvem sloupce. Zde je tocolor.meta_value AS color
.
Jakmile si zvyknete na používání tohoto vzoru, můžete jej naskládat pomocí kaskády LEFT JOIN
operací, abyste získali spoustu různých atributů, jako je např.
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
U tohoto dotazu jsem provedl spoustu odsazení, aby bylo snazší vidět vzor. Můžete dát přednost jinému stylu odsazení.
Je těžké vědět, proč jste měli problémy s výkonem s dotazem ve vaší otázce. Je to možná proto, že jste dostávali kombinační explozi se všemi INNER JOIN
operace, které byly následně filtrovány. Ale v každém případě dotaz, který jste zobrazili, pravděpodobně nevracel žádné řádky.
Pokud máte stále problémy s výkonem, zkuste vytvořit složený index na postmeta
na (post_id, meta_key, meta_value)
sloupců. Pokud vytváříte plugin WordPress, je to pravděpodobně práce, kterou musíte udělat při instalaci pluginu.