Изглежда, че се опитвате да получите набор от резултати с един ред на публикация от тип car
. Изглежда, че искате да покажете различни атрибути на всяка кола в публикацията и те са скрити в postmeta
.
Професионален съвет:Никога използвайте SELECT *
в софтуера, освен ако не знаете абсолютно защо го правите. Особено със заявки, съдържащи много JOIN
операции, SELECT *
връща много безсмислени и излишни колони.
Има трик за дизайна на заявки за WordPress postmeta
маса. Ако искате да получите конкретен атрибут, направете това:
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 */
Изключително важно е да разберете този модел, когато правите това, което се опитвате да направите. Този модел е задължителен, тъй като postmeta
е особен тип таблица, наречена ключ-стойност
или entity-attribute-value
магазин. Какво става тук? Няколко неща:
- Използвайки този модел, получавате по един ред за всяка публикация, с някои колони от
posts
таблица и конкретен атрибут отpostmeta
маса. - Вие сте
LEFT JOIN
чрезpostmeta
таблица, така че все още получавате ред, ако атрибутът липсва. - Използвате псевдоним за
postmeta
маса. Ето гоpostmeta AS color
. - Включвате селектора за
meta_key
(тук е'color' = color.meta_key
) вON
състояние на присъединяването. - Използвате псевдоним във вашия
SELECT
клауза за представяне наpostmeta.meta_value
елемент с подходящо име на колона. Ето гоcolor.meta_value AS color
.
След като свикнете да използвате този шаблон, можете да го подредите с каскада от LEFT JOIN
операции, за да получите много различни атрибути, например.
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
Направих куп отстъпи в тази заявка, за да улесня виждането на шаблона. Може да предпочетете различен стил на отстъп.
Трудно е да разберете защо сте имали проблеми с производителността на заявката във вашия въпрос. Вероятно защото получавахте комбинаторна експлозия с всички INNER JOIN
операции, които след това бяха филтрирани. Но във всеки случай заявката, която показахте, вероятно не връщаше никакви редове.
Ако все още имате проблеми с производителността, опитайте да създадете комбиниран индекс на postmeta
на (post_id, meta_key, meta_value)
колони. Ако създавате плъгин за WordPress, вероятно това е работа, която трябва да направите по време на инсталирането на приставката.