Трябва да се присъедините към post_meta
маса два пъти. Ето малко теория на базата данни.
Когато присъедините таблици, на теория временна таблица съдържа всички елементи от първата таблица, комбинирани с всички елементи от втората таблица, се създава и филтрира. Така че, ако например имате само 1 мета елемент на публикация и имате 3 публикации, тогава имате
+-------+----------+
|post_id|post_title|
+-------+----------+
| 1 | 'Post 1' |
| 2 | 'Post 2' |
| 3 | 'Post 3' |
+-------+----------+
и
+-------+----------+----------+------------+
|meta_id| post_id | meta_key | meta_value |
+-------+----------+----------+------------+
| 10 | 1 | k1 | v1 |
| 11 | 2 | k1 | v2 |
| 12 | 3 | k1 | v3 |
+-------+----------+----------+------------+
А "теоретичната" временна обединена таблица е:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
След това казвате:WHERE p.id =pm.post_id
и това филтрира временната таблица да бъде:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
Така че имате само един ред за всяка публикация + мета стойност. Заявката ви иска редове, които имат и двата meta_key = category
и meta_key =book_genre`, които не съществуват.
Така че имате нужда от таблица, която се присъединява към postmeta
таблица в TWICE.
Можете да направите това, като поставите псевдоним на таблицата, докато се присъединявате към тях. Извинете за опростяването:
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
Тук имате две свързани копия на postmeta таблицата с псевдоним на pm1
и pm2
(тъй като и ДВЕТЕ не могат да бъдат наречени wp_postmeta
в заявката.
След това можете да поискате:
AND pm1.meta_key = 'category'
AND pm1.meta_value = X
AND pm2.meta_key = 'book_genre'
AND pm2.meta_key IN (123,456)
Надяваме се, че можете да зашиете останалото от това.
Също така мисля, че можете да направите това с WP_Query, ако искате да отидете по този път.