आपको 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
both दोनों हैं और meta_key =book_genre` जो मौजूद नहीं है।
तो आपको एक टेबल चाहिए जो postmeta
. में शामिल हो दो बार में तालिका।
जब आप उनसे जुड़ते हैं तो आप तालिका को अलियासिंग करके ऐसा कर सकते हैं। मुझे सरल बनाने के लिए क्षमा करें:
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
. के लिए उपनामित पोस्टमेटा तालिका की दो सम्मिलित प्रतियां हैं और 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 के साथ कर सकते हैं।