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
poststabel dan atribut tertentu daripostmetameja. - Anda
LEFT JOINdalampostmetatabel sehingga Anda masih mendapatkan baris jika atributnya hilang. - Anda menggunakan nama alias untuk
postmetameja. Ini diapostmeta AS color. - Anda menyertakan pemilih untuk
meta_key(ini dia'color' = color.meta_key) di bagianONkondisi bergabung. - Anda menggunakan alias di
SELECTklausa untuk menampilkanpostmeta.meta_valueitem 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.