post_meta
に参加する必要があります テーブルを2回。ここにいくつかのデータベース理論があります。
テーブルを結合すると、理論的には、一時テーブルに最初のテーブルのすべてのアイテムが含まれ、2番目のテーブルのすべてのアイテムが作成およびフィルタリングされます。たとえば、投稿ごとにメタアイテムが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 |
+---------+------------+----------+----------+-----------+-------------+
したがって、投稿+メタ値ごとに1つの行しかありません。クエリは、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
ここに、pm1
にエイリアスされたpostmetaテーブルの2つの結合されたコピーがあります および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を使用してこれを行うことができると思います。