Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cải thiện truy vấn bằng cách sử dụng nhiều liên kết bên trong tới wp_postmeta, một bảng khóa / giá trị

Có vẻ như bạn đang cố gắng lấy tập hợp kết quả với một hàng cho mỗi bài đăng thuộc loại car . Có vẻ như bạn muốn hiển thị các thuộc tính khác nhau của từng chiếc xe trong bài đăng và những thuộc tính đó được lưu trữ trong postmeta .

Mẹo chuyên nghiệp: Không bao giờ sử dụng SELECT * trong phần mềm trừ khi bạn hoàn toàn biết lý do tại sao bạn đang làm điều đó. Đặc biệt với các truy vấn chứa nhiều JOIN hoạt động, SELECT * trả về nhiều cột vô nghĩa và dư thừa.

Có một thủ thuật thiết kế truy vấn cần biết cho postmeta trong WordPress bàn. Nếu bạn muốn lấy một thuộc tính cụ thể, hãy làm như sau:

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

Điều cực kỳ quan trọng là phải hiểu mô hình này khi làm những gì bạn đang cố gắng làm. Mẫu này là bắt buộc vì postmeta là một loại bảng đặc biệt được gọi là hoặc cửa hàng. Những gì đang xảy ra ở đây? Một vài điều:

  1. Sử dụng mẫu này, bạn sẽ nhận được một hàng cho mỗi bài đăng, với một số cột từ posts bảng và một thuộc tính cụ thể từ postmeta bảng.
  2. Bạn đang LEFT JOIN nhập postmeta để bạn vẫn nhận được một hàng nếu thiếu thuộc tính.
  3. Bạn đang sử dụng tên bí danh cho postmeta bàn. Đây là màu postmeta AS color .
  4. Bạn đang bao gồm bộ chọn cho meta_key (đây là 'color' = color.meta_key ) trong ON điều kiện tham gia.
  5. Bạn đang sử dụng bí danh trong SELECT của mình mệnh đề trình bày postmeta.meta_value mục có tên cột thích hợp. Đây là màu color.meta_value AS color .

Khi bạn đã quen với việc sử dụng mẫu này, bạn có thể xếp chồng lên nhau, với một dãy LEFT JOIN để nhận được nhiều thuộc tính khác nhau, như vậy.

     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

Tôi đã thực hiện một loạt các thao tác thụt lề trên truy vấn này để giúp bạn nhìn thấy mẫu dễ dàng hơn. Bạn có thể thích một kiểu thụt lề khác.

Thật khó để biết tại sao bạn lại gặp vấn đề về hiệu suất với truy vấn trong câu hỏi của mình. Có thể vì bạn đã nhận được một vụ nổ tổ hợp với tất cả INNER JOIN các hoạt động sau đó đã được lọc. Nhưng ở bất kỳ mức độ nào, truy vấn bạn hiển thị có thể không trả về hàng nào.

Nếu bạn vẫn gặp sự cố về hiệu suất, hãy thử tạo chỉ mục kết hợp trên postmeta trên (post_id, meta_key, meta_value) cột. Nếu bạn đang tạo một plugin WordPress, đó có thể là công việc cần làm vào lúc cài đặt plugin.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ví dụ về MySQL REGEXP

  2. Sử dụng Cơ sở dữ liệu quan hệ MySQL trên CentOS 5

  3. Kiểm tra xem cơ sở dữ liệu có tồn tại (MySQL) hay không và nếu không tạo nó bằng PHP

  4. Sự khác biệt giữa kiểu dữ liệu int và int (2) trong sql của tôi

  5. Làm cách nào để đặt một hàng MySQL thành CHỈ ĐỌC?