Mysql
 sql >> база данни >  >> RDS >> Mysql

Подобряване на заявка с помощта на много вътрешни присъединявания към wp_postmeta, таблица ключ/стойност

Изглежда, че се опитвате да получите набор от резултати с един ред на публикация от тип 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 е особен тип таблица, наречена или магазин. Какво става тук? Няколко неща:

  1. Използвайки този модел, получавате по един ред за всяка публикация, с някои колони от posts таблица и конкретен атрибут от postmeta маса.
  2. Вие сте LEFT JOIN чрез postmeta таблица, така че все още получавате ред, ако атрибутът липсва.
  3. Използвате псевдоним за postmeta маса. Ето го postmeta AS color .
  4. Включвате селектора за meta_key (тук е 'color' = color.meta_key ) в ON състояние на присъединяването.
  5. Използвате псевдоним във вашия 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, вероятно това е работа, която трябва да направите по време на инсталирането на приставката.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysqldump с ред за създаване на база данни

  2. Как да посочите Ruby regex, когато използвате Active Record в Rails?

  3. Извличане на повече от 3 данни от mysql в квадратчето за отметка

  4. Ред на пълнотекстово търсене в MYSQL по уместност

  5. Какво представлява низът за свързване на MySQL JDBC драйвер?