Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Ulepszanie zapytania przy użyciu wielu wewnętrznych sprzężeń do wp_postmeta, tabeli klucz/wartość

Wygląda na to, że próbujesz uzyskać zestaw wyników z jednym wierszem na post typu car . Wygląda na to, że chcesz wyświetlić różne atrybuty każdego samochodu w poście, a te są ukryte w postmeta .

Wskazówka dla profesjonalistów:Nigdy użyj SELECT * w oprogramowaniu, chyba że absolutnie wiesz, dlaczego to robisz. Zwłaszcza w przypadku zapytań zawierających dużo JOIN operacje, SELECT * zwraca wiele bezsensownych i zbędnych kolumn.

W postmeta WordPressa trzeba znać sztuczkę z projektowaniem zapytań stół. Jeśli chcesz uzyskać określony atrybut, zrób tak:

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

Bardzo ważne jest, aby zrozumieć ten wzorzec, gdy robisz to, co próbujesz zrobić. Ten wzorzec jest wymagany, ponieważ postmeta to specyficzny typ tabeli o nazwie lub sklep. Co tu się dzieje? Kilka rzeczy:

  1. Korzystając z tego wzorca, otrzymasz jeden wiersz na każdy post, z kilkoma kolumnami z posts tabela i konkretny atrybut z postmeta stół.
  2. Jesteś LEFT JOIN ing postmeta tabeli, więc nadal otrzymujesz wiersz, jeśli brakuje atrybutu.
  3. Używasz aliasu dla postmeta stół. Oto postmeta AS color .
  4. Dołączasz selektor dla meta_key (tutaj jest to 'color' = color.meta_key ) w ON warunek połączenia.
  5. Używasz aliasu w swoim SELECT klauzula prezentująca postmeta.meta_value element z odpowiednią nazwą kolumny. Oto color.meta_value AS color .

Kiedy już przyzwyczaisz się do używania tego wzorca, możesz go ułożyć w stos z kaskadą LEFT JOIN operacji, aby uzyskać wiele różnych atrybutów, tak jak tutaj.

     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

Zrobiłem kilka wcięć w tym zapytaniu, aby ułatwić zobaczenie wzorca. Możesz preferować inny styl wcięcia.

Trudno powiedzieć, dlaczego masz problemy z wydajnością zapytania w swoim pytaniu. Możliwe, że otrzymujesz kombinatoryjną eksplozję ze wszystkimi INNER JOIN operacje, które zostały następnie przefiltrowane. Ale w każdym razie zapytanie, które pokazałeś, prawdopodobnie nie zwracało żadnych wierszy.

Jeśli nadal masz problemy z wydajnością, spróbuj utworzyć indeks złożony w postmeta na (post_id, meta_key, meta_value) kolumny. Jeśli tworzysz wtyczkę WordPress, prawdopodobnie jest to zadanie do wykonania podczas instalacji wtyczki.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Jak przeszukiwać wiele tabel w poszukiwaniu ciągu istniejącego w dowolnej kolumnie?

  2. MySQL:nie można określić „zadań” tabeli docelowej do aktualizacji w klauzuli FROM

  3. Wykonaj nieprzetworzone zapytanie na MySQL Loopback Connector

  4. Kiedy przechowywać obrazy w bazie danych (mySQL), a kiedy nie? (Łączenie obrazu z elementem w bazie danych)

  5. STWÓRZ TABELĘ JAK A1 jako A2