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
poststabela i konkretny atrybut zpostmetastół. - Jesteś
LEFT JOINingpostmetatabeli, więc nadal otrzymujesz wiersz, jeśli brakuje atrybutu. - Używasz aliasu dla
postmetastół. Otopostmeta AS color. - Dołączasz selektor dla
meta_key(tutaj jest to'color' = color.meta_key) wONwarunek połączenia. - Używasz aliasu w swoim
SELECTklauzula prezentującapostmeta.meta_valueelement 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.