Musisz dołączyć do post_meta
stół dwa razy. Oto trochę teorii na temat baz danych.
Kiedy łączysz tabele, teoretycznie tworzona i filtrowana jest tabela tymczasowa zawierająca wszystkie elementy z pierwszej tabeli połączone ze wszystkimi elementami z drugiej tabeli. Więc jeśli na przykład masz tylko 1 element meta na post, a masz 3 posty, to masz
+-------+----------+
|post_id|post_title|
+-------+----------+
| 1 | 'Post 1' |
| 2 | 'Post 2' |
| 3 | 'Post 3' |
+-------+----------+
i
+-------+----------+----------+------------+
|meta_id| post_id | meta_key | meta_value |
+-------+----------+----------+------------+
| 10 | 1 | k1 | v1 |
| 11 | 2 | k1 | v2 |
| 12 | 3 | k1 | v3 |
+-------+----------+----------+------------+
A „teoretyczna” tymczasowa tabela połączona to:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
Następnie mówisz:GDZIE p.id =pm.post_id
a to odfiltruje tymczasową tabelę tak, aby była:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
Więc masz tylko jeden wiersz na każdy post + wartość meta. Twoje zapytanie wymaga wierszy, które mają zarówno meta_key = category
i meta_key =book_genre` które nie istnieją.
Potrzebujesz więc tabeli, która łączy postmeta
stół za DWA RAZY.
Możesz to zrobić, tworząc alias tabeli podczas dołączania. Wybacz uproszczenie:
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
Tutaj masz dwie połączone kopie tabeli postmeta z aliasem pm1
i pm2
(ponieważ OBYDWA nie mogą być nazwane wp_postmeta
w zapytaniu.
Następnie możesz poprosić o:
AND pm1.meta_key = 'category'
AND pm1.meta_value = X
AND pm2.meta_key = 'book_genre'
AND pm2.meta_key IN (123,456)
Mam nadzieję, że uda Ci się połączyć resztę z tego.
Myślę też, że możesz to zrobić za pomocą WP_Query, jeśli chcesz iść tą drogą.