Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Meningkatkan kueri menggunakan banyak gabungan dalam ke wp_postmeta, tabel kunci/nilai

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 atau toko. Apa yang terjadi di sini? Beberapa hal:

  1. Dengan menggunakan pola ini, Anda akan mendapatkan satu baris untuk setiap postingan, dengan beberapa kolom dari posts tabel dan atribut tertentu dari postmeta meja.
  2. Anda LEFT JOIN dalam postmeta tabel sehingga Anda masih mendapatkan baris jika atributnya hilang.
  3. Anda menggunakan nama alias untuk postmeta meja. Ini dia postmeta AS color .
  4. Anda menyertakan pemilih untuk meta_key (ini dia 'color' = color.meta_key ) di bagian ON kondisi bergabung.
  5. Anda menggunakan alias di SELECT klausa untuk menampilkan postmeta.meta_value item dengan nama kolom yang sesuai. Ini dia color.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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. #1062 - Entri duplikat '' untuk kunci 'unique_id' Saat Mencoba menambahkan KUNCI UNIK (MySQL)

  2. Perbaiki Akses ditolak untuk pengguna 'root'@'localhost' untuk phpMyAdmin

  3. Pilih, di mana JSON Array berisi

  4. Fungsi tidak terdefinisi mysql_connect()

  5. Bagaimana cara membuat daftar parameter prosedur tersimpan mysql