sql >> Database teknologi >  >> RDS >> Mysql

Forbedring af en forespørgsel ved hjælp af en masse indre joinforbindelser til wp_postmeta, en nøgle/værdi-tabel

Det ser ud til, at du forsøger at opnå et resultatsæt med én række pr. post af typen car . Det ser ud til, at du ønsker at vise forskellige egenskaber for hver bil i posten, og disse er gemt væk i postmeta .

Professionelt tip:Aldrig brug SELECT * i software, medmindre du absolut ved, hvorfor du gør det. Især med forespørgsler, der indeholder masser af JOIN operationer, SELECT * returnerer masser af meningsløse og overflødige kolonner.

Der er et forespørgselsdesigntrick at kende til WordPress postmeta bord. Hvis du vil have en bestemt egenskab, skal du gøre dette:

 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 er supervigtigt at forstå dette mønster, når du gør det, du prøver at gøre. Dette mønster er påkrævet, fordi postmeta er en ejendommelig type tabel kaldet en eller butik. Hvad sker der her? Et par ting:

  1. Ved at bruge dette mønster får du en række for hvert indlæg med nogle kolonner fra posts tabel og en bestemt attribut fra postmeta tabel.
  2. Du er LEFT JOIN ved at bruge postmeta tabel, så du stadig får en række, hvis attributten mangler.
  3. Du bruger et aliasnavn til postmeta bord. Her er det postmeta AS color .
  4. Du inkluderer vælgeren for meta_key (her er det 'color' = color.meta_key ) i ON sammenføjningens tilstand.
  5. Du bruger et alias i din SELECT klausul for at præsentere postmeta.meta_value element med et passende kolonnenavn. Her er det color.meta_value AS color .

Når du har vænnet dig til at bruge dette mønster, kan du stable det op med en kaskade af LEFT JOIN operationer, for at få mange forskellige attributter, f.eks.

     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

Jeg har lavet en masse indrykning på denne forespørgsel for at gøre det nemmere at se mønsteret. Du foretrækker måske en anden indrykningsstil.

Det er svært at vide, hvorfor du havde problemer med ydeevnen med forespørgslen i dit spørgsmål. Det er muligvis fordi du fik en kombinatorisk eksplosion med alle de INNER JOIN operationer, der derefter blev filtreret. Men i hvert fald returnerede den forespørgsel, du viste, sandsynligvis ingen rækker.

Hvis du stadig har problemer med ydeevnen, så prøv at oprette et sammensat indeks på postmeta(post_id, meta_key, meta_value) kolonner. Hvis du opretter et WordPress-plugin, er det sandsynligvis et job, du skal udføre ved installation af plugin.



  1. komme efter bredde- og længdegrad i laravel 5 med andre sammenføjninger

  2. Omarranger rækker i en MySQL-tabel

  3. Brug af aggregerede funktioner (SUM, AVG, MAX, MIN, COUNT, DISTINCT) i MySQL

  4. MySQL oprette lagrede procedure syntaks med afgrænser