Musíte se připojit k post_meta
stůl dvakrát. Zde je nějaká teorie databáze.
Když spojíte tabulky, teoreticky se vytvoří a filtruje dočasná tabulka obsahující všechny položky z první tabulky v kombinaci se všemi položkami z druhé tabulky. Takže pokud máte například pouze 1 meta položku na příspěvek a máte 3 příspěvky, pak máte
+-------+----------+
|post_id|post_title|
+-------+----------+
| 1 | 'Post 1' |
| 2 | 'Post 2' |
| 3 | 'Post 3' |
+-------+----------+
a
+-------+----------+----------+------------+
|meta_id| post_id | meta_key | meta_value |
+-------+----------+----------+------------+
| 10 | 1 | k1 | v1 |
| 11 | 2 | k1 | v2 |
| 12 | 3 | k1 | v3 |
+-------+----------+----------+------------+
A "teoretická" dočasně spojená tabulka je:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
Potom řeknete:WHERE p.id =pm.post_id
a to filtruje dočasnou tabulku na:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
Máte tedy pouze jeden řádek pro každý příspěvek + meta hodnotu. Váš dotaz požaduje řádky, které mají oba meta_key = category
a meta_key =book_genre` které neexistují.
Potřebujete tedy tabulku, která spojuje postmeta
tabulka DVAKRÁT.
Můžete to udělat aliasem tabulky, když se k nim připojíte. Promiňte mi zjednodušení:
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
Zde máte dvě spojené kopie postmeta tabulky s aliasem pm1
a pm2
(protože nemohou být OBA nazývány wp_postmeta
v dotazu.
Poté můžete požádat o:
AND pm1.meta_key = 'category'
AND pm1.meta_value = X
AND pm2.meta_key = 'book_genre'
AND pm2.meta_key IN (123,456)
Doufejme, že z toho dokážete sešít zbytek.
Také si myslím, že to můžete udělat pomocí WP_Query, pokud chcete jít touto cestou.