ऐसा लगता है कि आप car
. प्रकार की प्रति पोस्ट एक पंक्ति के साथ परिणाम सेट प्राप्त करने का प्रयास कर रहे हैं . ऐसा लगता है कि आप पोस्ट में प्रत्येक कार की विभिन्न विशेषताओं को प्रदर्शित करना चाहते हैं, और उन्हें postmeta
में छिपा दिया गया है। .
प्रो टिप:कभी नहीं SELECT *
. का उपयोग करें सॉफ्टवेयर में जब तक आप पूरी तरह से नहीं जानते कि आप ऐसा क्यों कर रहे हैं। विशेष रूप से बहुत सारे JOIN
वाले प्रश्नों के साथ संचालन, SELECT *
बहुत सारे व्यर्थ और निरर्थक कॉलम लौटाता है।
WordPress postmeta
. के बारे में जानने के लिए एक क्वेरी डिज़ाइन ट्रिक है टेबल। यदि आप कोई विशेष विशेषता प्राप्त करना चाहते हैं, तो यह करें:
SELECT p.ID, p.post_title,
color.meta_value AS color
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS color ON p.ID = color.post_id AND 'color' = color.meta_key
WHERE p.post_status = 'publish'
AND /* etc etc */
आप जो करने का प्रयास कर रहे हैं उसे करते समय इस पैटर्न को समझना अति-महत्वपूर्ण है। यह पैटर्न आवश्यक है क्योंकि postmeta
एक विशिष्ट प्रकार की तालिका है जिसे की-वैल्यू
कहा जाता है। या entity-attribute-value
दुकान। यहाँ क्या चल रहा है? कुछ चीज़ें:
- इस पैटर्न का उपयोग करके आपको प्रत्येक पोस्ट के लिए एक पंक्ति मिलती है, जिसमें
posts
से कुछ कॉलम होते हैं। तालिका औरpostmeta
. से एक विशेष विशेषता टेबल. - आप
LEFT JOIN
. हैंpostmeta
तालिका ताकि विशेषता गुम होने पर भी आपको एक पंक्ति मिले। - आप
postmeta
. के लिए किसी अन्य नाम का उपयोग कर रहे हैं टेबल। यहाँ यह हैpostmeta AS color
। - आप
meta_key
. के चयनकर्ता को शामिल कर रहे हैं (यहाँ यह है'color' = color.meta_key
)ON
. में शामिल होने की स्थिति। - आप अपने
SELECT
. में एक उपनाम का इस्तेमाल कर रहे हैं पेश करने के लिए खंडpostmeta.meta_value
उपयुक्त कॉलम नाम वाला आइटम। यहाँ यह हैcolor.meta_value AS color
।
एक बार जब आप इस पैटर्न को नियोजित करने के लिए अभ्यस्त हो जाते हैं, तो आप इसे LEFT JOIN
के कैस्केड के साथ ढेर कर सकते हैं। संचालन, कई अलग-अलग विशेषताओं को प्राप्त करने के लिए, जैसे।
SELECT wp_posts.ID, wp_posts.post_title, wp_posts.whatever,
color.meta_value AS color,
transmission.meta_value AS transmission,
model.meta_value AS model,
brand.meta_value AS brand
FROM wp_posts
LEFT JOIN wp_postmeta AS color
ON wp_posts.ID = color.post_id AND color.meta_key='color'
LEFT JOIN wp_postmeta AS transmission
ON wp_posts.ID = transmission.post_id AND transmission.meta_key='transmission'
LEFT JOIN wp_postmeta AS model
ON wp_posts.ID = model.post_id AND model.meta_key='model'
LEFT JOIN wp_postmeta AS brand
ON wp_posts.ID = brand.post_id AND brand.meta_key='brand'
WHERE wp_posts.post_status = 'publish'
AND wp_posts.post_type = 'car'
ORDER BY wp_posts.post_title
पैटर्न को देखना आसान बनाने के लिए मैंने इस क्वेरी पर इंडेंटिंग का एक गुच्छा किया है। आप एक अलग इंडेंटिंग शैली पसंद कर सकते हैं।
यह जानना कठिन है कि आपको अपने प्रश्न में क्वेरी के साथ प्रदर्शन संबंधी समस्याएं क्यों आ रही थीं। यह संभवतः इसलिए है क्योंकि आपको सभी INNER JOIN
के साथ एक कॉम्बीनेटरियल विस्फोट मिल रहा था। संचालन जो तब फ़िल्टर किया गया था। लेकिन किसी भी मामले में आपने जो प्रश्न दिखाया वह शायद कोई पंक्ति नहीं लौटा रहा था।
यदि आपको अभी भी प्रदर्शन समस्या हो रही है, तो postmeta
. पर एक मिश्रित अनुक्रमणिका बनाने का प्रयास करें (post_id, meta_key, meta_value)
. पर स्तंभ। यदि आप एक वर्डप्रेस प्लगइन बना रहे हैं, तो शायद प्लगइन स्थापना के समय यह एक काम है।