Du måste gå med i post_meta
bord två gånger. Här är lite databasteori.
När du sammanfogar tabeller, i teorin, en temporär tabell innehåller alla objekt från den första tabellen kombinerat med alla objekt från den andra tabellen skapas och filtreras. Så om du till exempel bara har 1 metaobjekt per inlägg och du har 3 inlägg så har du
+-------+----------+
|post_id|post_title|
+-------+----------+
| 1 | 'Post 1' |
| 2 | 'Post 2' |
| 3 | 'Post 3' |
+-------+----------+
och
+-------+----------+----------+------------+
|meta_id| post_id | meta_key | meta_value |
+-------+----------+----------+------------+
| 10 | 1 | k1 | v1 |
| 11 | 2 | k1 | v2 |
| 12 | 3 | k1 | v3 |
+-------+----------+----------+------------+
Och den "teoretiska" tillfälligt sammanfogade tabellen är:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
Du säger då:WHERE p.id =pm.post_id
och detta filtrerar den tillfälliga tabellen till att vara:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
Så du har bara en rad för varje inlägg + metavärde. Din fråga frågar efter rader som har både meta_key = category
och meta_key =book_genre` som inte finns.
Så du behöver en tabell som ansluter till postmeta
tabell i TVÅ GANGER.
Du kan göra detta genom att aliasera tabellen när du går med i dem. Ursäkta att jag förenklar:
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
Här har du två sammanfogade kopior av postmetatabellen alias till pm1
och pm2
(eftersom de inte kan BÅDA kallas wp_postmeta
i frågan.
Du kan sedan be om:
AND pm1.meta_key = 'category'
AND pm1.meta_value = X
AND pm2.meta_key = 'book_genre'
AND pm2.meta_key IN (123,456)
Förhoppningsvis kan du sy ihop resten av det.
Jag tror också att du kan göra detta med WP_Query om du vill gå den vägen.