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à khóa-giá trị
hoặc entity-thuộc tính-giá trị
cửa hàng. Những gì đang xảy ra ở đây? Một vài điều:
- 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. - Bạn đang
LEFT JOIN
nhậppostmeta
để bạn vẫn nhận được một hàng nếu thiếu thuộc tính. - Bạn đang sử dụng tên bí danh cho
postmeta
bàn. Đây là màupostmeta AS color
. - Bạn đang bao gồm bộ chọn cho
meta_key
(đây là'color' = color.meta_key
) trongON
điều kiện tham gia. - Bạn đang sử dụng bí danh trong
SELECT
của mình mệnh đề trình bàypostmeta.meta_value
mục có tên cột thích hợp. Đây là màucolor.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.