Wygląda na to, że próbujesz uzyskać zestaw wyników z jednym wierszem na post typu car
. Wygląda na to, że chcesz wyświetlić różne atrybuty każdego samochodu w poście, a te są ukryte w postmeta
.
Wskazówka dla profesjonalistów:Nigdy użyj SELECT *
w oprogramowaniu, chyba że absolutnie wiesz, dlaczego to robisz. Zwłaszcza w przypadku zapytań zawierających dużo JOIN
operacje, SELECT *
zwraca wiele bezsensownych i zbędnych kolumn.
W postmeta
WordPressa trzeba znać sztuczkę z projektowaniem zapytań stół. Jeśli chcesz uzyskać określony atrybut, zrób tak:
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 */
Bardzo ważne jest, aby zrozumieć ten wzorzec, gdy robisz to, co próbujesz zrobić. Ten wzorzec jest wymagany, ponieważ postmeta
to specyficzny typ tabeli o nazwie klucz-wartość
lub entity-attribute-value
sklep. Co tu się dzieje? Kilka rzeczy:
- Korzystając z tego wzorca, otrzymasz jeden wiersz na każdy post, z kilkoma kolumnami z
posts
tabela i konkretny atrybut zpostmeta
stół. - Jesteś
LEFT JOIN
ingpostmeta
tabeli, więc nadal otrzymujesz wiersz, jeśli brakuje atrybutu. - Używasz aliasu dla
postmeta
stół. Otopostmeta AS color
. - Dołączasz selektor dla
meta_key
(tutaj jest to'color' = color.meta_key
) wON
warunek połączenia. - Używasz aliasu w swoim
SELECT
klauzula prezentującapostmeta.meta_value
element z odpowiednią nazwą kolumny. Otocolor.meta_value AS color
.
Kiedy już przyzwyczaisz się do używania tego wzorca, możesz go ułożyć w stos z kaskadą LEFT JOIN
operacji, aby uzyskać wiele różnych atrybutów, tak jak tutaj.
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
Zrobiłem kilka wcięć w tym zapytaniu, aby ułatwić zobaczenie wzorca. Możesz preferować inny styl wcięcia.
Trudno powiedzieć, dlaczego masz problemy z wydajnością zapytania w swoim pytaniu. Możliwe, że otrzymujesz kombinatoryjną eksplozję ze wszystkimi INNER JOIN
operacje, które zostały następnie przefiltrowane. Ale w każdym razie zapytanie, które pokazałeś, prawdopodobnie nie zwracało żadnych wierszy.
Jeśli nadal masz problemy z wydajnością, spróbuj utworzyć indeks złożony w postmeta
na (post_id, meta_key, meta_value)
kolumny. Jeśli tworzysz wtyczkę WordPress, prawdopodobnie jest to zadanie do wykonania podczas instalacji wtyczki.