Sepertinya Anda mencoba untuk mendapatkan hasil yang ditetapkan dengan satu baris per posting dari jenis car
. Sepertinya Anda ingin menampilkan berbagai atribut dari setiap mobil di pos, dan itu disimpan di postmeta
.
Kiat pro:Tidak pernah gunakan SELECT *
dalam perangkat lunak kecuali Anda benar-benar tahu mengapa Anda melakukannya. Terutama dengan kueri yang mengandung banyak JOIN
operasi, SELECT *
mengembalikan banyak kolom yang tidak berguna dan berlebihan.
Ada trik desain kueri yang perlu diketahui untuk postmeta
WordPress meja. Jika Anda ingin mendapatkan atribut tertentu, lakukan ini:
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 */
Sangat penting untuk memahami pola ini saat melakukan apa yang Anda coba lakukan. Pola ini diperlukan karena postmeta
adalah jenis tabel khusus yang disebut key-value
atau entity-attribute-value
toko. Apa yang terjadi di sini? Beberapa hal:
- Dengan menggunakan pola ini, Anda akan mendapatkan satu baris untuk setiap postingan, dengan beberapa kolom dari
posts
tabel dan atribut tertentu daripostmeta
meja. - Anda
LEFT JOIN
dalampostmeta
tabel sehingga Anda masih mendapatkan baris jika atributnya hilang. - Anda menggunakan nama alias untuk
postmeta
meja. Ini diapostmeta AS color
. - Anda menyertakan pemilih untuk
meta_key
(ini dia'color' = color.meta_key
) di bagianON
kondisi bergabung. - Anda menggunakan alias di
SELECT
klausa untuk menampilkanpostmeta.meta_value
item dengan nama kolom yang sesuai. Ini diacolor.meta_value AS color
.
Setelah Anda terbiasa menggunakan pola ini, Anda dapat menumpuknya, dengan rangkaian LEFT JOIN
operasi, untuk mendapatkan banyak atribut yang berbeda, seperti itu.
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
Saya telah melakukan banyak indentasi pada kueri ini untuk memudahkan melihat polanya. Anda dapat memilih gaya indentasi yang berbeda.
Sulit untuk mengetahui mengapa Anda mengalami masalah kinerja dengan kueri dalam pertanyaan Anda. Mungkin karena Anda mendapatkan ledakan kombinatorial dengan semua INNER JOIN
operasi yang kemudian disaring. Tapi bagaimanapun juga, kueri yang Anda tunjukkan mungkin tidak menghasilkan baris.
Jika Anda masih mengalami masalah kinerja, coba buat indeks gabungan di postmeta
pada (post_id, meta_key, meta_value)
kolom. Jika Anda membuat plugin WordPress, itu mungkin pekerjaan yang harus dilakukan pada saat instalasi plugin.