Bạn cần tham gia post_meta
bảng hai lần. Đây là một số lý thuyết về cơ sở dữ liệu.
Khi bạn nối các bảng, về lý thuyết, một bảng tạm thời chứa tất cả các mục từ bảng đầu tiên kết hợp với tất cả các mục từ bảng thứ hai sẽ được tạo và lọc. Vì vậy, ví dụ:nếu bạn chỉ có 1 meta item cho mỗi bài đăng và bạn có 3 bài viết thì bạn có
+-------+----------+
|post_id|post_title|
+-------+----------+
| 1 | 'Post 1' |
| 2 | 'Post 2' |
| 3 | 'Post 3' |
+-------+----------+
và
+-------+----------+----------+------------+
|meta_id| post_id | meta_key | meta_value |
+-------+----------+----------+------------+
| 10 | 1 | k1 | v1 |
| 11 | 2 | k1 | v2 |
| 12 | 3 | k1 | v3 |
+-------+----------+----------+------------+
Và bảng kết hợp tạm thời "lý thuyết" là:
+---------+------------+----------+----------+-----------+-------------+
|p.post_id|p.post_title|pm.meta_id|pm.post_id|pm.meta_key|pm.meta_value|
+---------+------------+----------+----------+-----------+-------------+
| 1 | 'Post 1' | 10 | 1 | k1 | v1 |
| 1 | 'Post 1' | 11 | 2 | k1 | v2 |
| 1 | 'Post 1' | 12 | 3 | k1 | v3 |
| 2 | 'Post 2' | 10 | 1 | k1 | v1 |
| 2 | 'Post 2' | 11 | 2 | k1 | v2 |
| 2 | 'Post 2' | 12 | 3 | k1 | v3 |
| 3 | 'Post 3' | 10 | 1 | k1 | v1 |
| 3 | 'Post 3' | 11 | 2 | k1 | v2 |
| 3 | 'Post 3' | 12 | 3 | k1 | v3 |
+---------+------------+----------+----------+-----------+-------------+
Sau đó, bạn nói:WHERE p.id =pm.post_id
và điều này lọc bảng tạm thời thành:
+---------+------------+----------+----------+-----------+-------------+
|p.post_id|p.post_title|pm.meta_id|pm.post_id|pm.meta_key|pm.meta_value|
+---------+------------+----------+----------+-----------+-------------+
| 1 | 'Post 1' | 10 | 1 | k1 | v1 |
| 2 | 'Post 2' | 11 | 2 | k1 | v2 |
| 3 | 'Post 3' | 12 | 3 | k1 | v3 |
+---------+------------+----------+----------+-----------+-------------+
Vì vậy, bạn chỉ có một hàng cho mỗi bài đăng + giá trị meta. Truy vấn của bạn đang yêu cầu các hàng có cả meta_key = category
và meta_key =book_genre` không tồn tại.
Vì vậy, bạn cần một bảng tham gia postmeta
bảng trong TWICE.
Bạn có thể thực hiện việc này bằng cách đặt bí danh cho bảng khi tham gia cùng với chúng. Thứ lỗi cho tôi vì đã đơn giản hóa:
SELECT wp_posts.*, pm1.*, pm2.*
FROM
wp_posts
wp_postmeta as pm1
wp_postmeta as pm2
WHERE pm1.post_id = wp_posts.ID
AND pm2.post_id = wp_posts.ID
AND ...etc
Ở đây bạn có hai bản sao đã kết hợp của bảng postmeta được đặt bí danh là pm1
và pm2
(vì chúng không thể được gọi là CẢ wp_postmeta
trong truy vấn.
Sau đó, bạn có thể yêu cầu:
AND pm1.meta_key = 'category'
AND pm1.meta_value = X
AND pm2.meta_key = 'book_genre'
AND pm2.meta_key IN (123,456)
Hy vọng rằng bạn có thể ghép những phần còn lại từ đó lại với nhau.
Tôi cũng nghĩ rằng bạn có thể làm điều này với WP_Query nếu bạn muốn đi theo con đường đó.