Je moet lid worden van de post_meta
twee keer tafelen. Hier is wat databasetheorie.
Wanneer u tabellen samenvoegt, wordt in theorie een tijdelijke tabel gemaakt en bevat alle items uit de eerste tabel gecombineerd met alle items uit de tweede tabel. Dus als je bijvoorbeeld maar 1 meta-item per bericht hebt en je hebt 3 berichten, dan heb je
+-------+----------+
|post_id|post_title|
+-------+----------+
| 1 | 'Post 1' |
| 2 | 'Post 2' |
| 3 | 'Post 3' |
+-------+----------+
en
+-------+----------+----------+------------+
|meta_id| post_id | meta_key | meta_value |
+-------+----------+----------+------------+
| 10 | 1 | k1 | v1 |
| 11 | 2 | k1 | v2 |
| 12 | 3 | k1 | v3 |
+-------+----------+----------+------------+
En de "theoretische" tijdelijke samengevoegde tabel is:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
Je zegt dan:WHERE p.id =pm.post_id
en dit filtert de tijdelijke tabel als:
+---------+------------+----------+----------+-----------+-------------+
|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 |
+---------+------------+----------+----------+-----------+-------------+
Je hebt dus maar één rij voor elke post + metawaarde. Uw zoekopdracht vraagt om rijen die zowel meta_key = category
. hebben en meta_key =book_genre` die niet bestaan.
Je hebt dus een tabel nodig die aansluit bij de postmeta
tabel in TWEE KEER.
U kunt dit doen door de tabel een alias te geven terwijl u zich bij hen voegt. Vergeef me voor het vereenvoudigen:
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
Hier heb je twee samengevoegde exemplaren van de postmeta-tabel met de alias pm1
en pm2
(omdat ze niet BEIDE wp_postmeta
kunnen heten in de zoekopdracht.
U kunt dan vragen om:
AND pm1.meta_key = 'category'
AND pm1.meta_value = X
AND pm2.meta_key = 'book_genre'
AND pm2.meta_key IN (123,456)
Hopelijk kun je de rest daaruit aan elkaar naaien.
Ik denk ook dat je dit met WP_Query kunt doen als je die weg wilt gaan.