sql >> Databáze >  >> RDS >> Mysql

Vylepšení dotazu pomocí velkého množství vnitřních spojení s tabulkou klíč/hodnota wp_postmeta

Zdá se, že se pokoušíte získat sadu výsledků s jedním řádkem na příspěvek typu car . Zdá se, že chcete v příspěvku zobrazit různé atributy každého auta a ty jsou schované v postmeta .

Tip pro profesionály:Nikdy použijte SELECT * v softwaru, pokud absolutně nevíte, proč to děláte. Zejména u dotazů obsahujících mnoho JOIN operace, SELECT * vrátí spoustu zbytečných a nadbytečných sloupců.

Pro postmeta WordPressu je potřeba znát trik pro návrh dotazů stůl. Pokud chcete získat konkrétní atribut, udělejte toto:

 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 */

Je velmi důležité pochopit tento vzorec, když děláte to, o co se snažíte. Tento vzor je povinný, protože postmeta je zvláštní typ tabulky zvaný nebo ukládat. Co se tam děje? Pár věcí:

  1. Pomocí tohoto vzoru získáte jeden řádek pro každý příspěvek s několika sloupci z posts tabulka a konkrétní atribut z postmeta stůl.
  2. Jste LEFT JOIN v postmeta tabulka, takže stále získáte řádek, pokud atribut chybí.
  3. Používáte alias pro postmeta stůl. Zde je postmeta AS color .
  4. Zahrnujete selektor pro meta_key (zde je to 'color' = color.meta_key ) v ON podmínkou připojení.
  5. Ve SELECT používáte alias klauzule k prezentaci postmeta.meta_value položka s příslušným názvem sloupce. Zde je to color.meta_value AS color .

Jakmile si zvyknete na používání tohoto vzoru, můžete jej naskládat pomocí kaskády LEFT JOIN operací, abyste získali spoustu různých atributů, jako je např.

     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

U tohoto dotazu jsem provedl spoustu odsazení, aby bylo snazší vidět vzor. Můžete dát přednost jinému stylu odsazení.

Je těžké vědět, proč jste měli problémy s výkonem s dotazem ve vaší otázce. Je to možná proto, že jste dostávali kombinační explozi se všemi INNER JOIN operace, které byly následně filtrovány. Ale v každém případě dotaz, který jste zobrazili, pravděpodobně nevracel žádné řádky.

Pokud máte stále problémy s výkonem, zkuste vytvořit složený index na postmeta na (post_id, meta_key, meta_value) sloupců. Pokud vytváříte plugin WordPress, je to pravděpodobně práce, kterou musíte udělat při instalaci pluginu.



  1. MySQL časové razítko vyberte časové období

  2. Vložit blob do databáze Oracle pomocí C#

  3. oracle plsql:jak analyzovat XML a vložit do tabulky

  4. Připojení Java ke Cloud SQL 2nd Gen z Appengine Managed VM