sql >> Databasteknik >  >> RDS >> Mysql

Förbättra en fråga med många inre kopplingar till wp_postmeta, en nyckel-/värdetabell

Det verkar som om du försöker få en resultatuppsättning med en rad per post av typen car . Det verkar som om du vill visa olika attribut för varje bil i inlägget, och de är gömda i postmeta .

Proffstips:Aldrig använd SELECT * i programvara om du inte absolut vet varför du gör det. Speciellt med frågor som innehåller många JOIN operationer, SELECT * returnerar massor av meningslösa och redundanta kolumner.

Det finns ett frågedesigntrick att känna till för WordPress postmeta tabell. Om du vill få ett visst attribut, gör så här:

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

Det är superviktigt att förstå detta mönster när du gör det du försöker göra. Detta mönster krävs eftersom postmeta är en speciell typ av tabell som kallas ett eller Lagra. Vad händer här? Några saker:

  1. Med det här mönstret får du en rad för varje inlägg, med några kolumner från posts tabell och ett visst attribut från postmeta tabell.
  2. Du är LEFT JOIN genom att använda postmeta tabell så att du fortfarande får en rad om attributet saknas.
  3. Du använder ett aliasnamn för postmeta tabell. Här är det postmeta AS color .
  4. Du inkluderar väljaren för meta_key (här är det 'color' = color.meta_key ) i ON skick för sammanfogningen.
  5. Du använder ett alias i din SELECT sats för att presentera postmeta.meta_value objekt med ett lämpligt kolumnnamn. Här är det color.meta_value AS color .

När du väl har vant dig vid att använda det här mönstret kan du stapla det med en kaskad av LEFT JOIN operationer, för att få massor av olika attribut, som så.

     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

Jag har gjort ett gäng indrag på den här frågan för att göra det lättare att se mönstret. Du kanske föredrar en annan indragsstil.

Det är svårt att veta varför du hade prestandaproblem med frågan i din fråga. Det är möjligen för att du fick en kombinatorisk explosion med alla INNER JOIN operationer som sedan filtrerades. Men i vilket fall som helst returnerade frågan du visade förmodligen inga rader.

Om du fortfarande har problem med prestanda, försök skapa ett sammansatt index på postmeta(post_id, meta_key, meta_value) kolumner. Om du skapar ett WordPress-plugin är det förmodligen ett jobb att göra vid installationen av plugin.



  1. Oracle ORA-12154-fel på lokal IIS, men inte med Visual Studio Development Server

  2. MySQL felkod:1175 under UPPDATERING i MySQL Workbench

  3. java.lang.IllegalArgumentException:kolumnen '_id' finns inte

  4. Entity Framework C# Infoga data ryska kodningsproblem