Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

wp_postmeta, एक कुंजी/मान तालिका में बहुत सारे आंतरिक जुड़ावों का उपयोग करके एक क्वेरी में सुधार करना

ऐसा लगता है कि आप 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 एक विशिष्ट प्रकार की तालिका है जिसे कहा जाता है। या दुकान। यहाँ क्या चल रहा है? कुछ चीज़ें:

  1. इस पैटर्न का उपयोग करके आपको प्रत्येक पोस्ट के लिए एक पंक्ति मिलती है, जिसमें posts से कुछ कॉलम होते हैं। तालिका और postmeta . से एक विशेष विशेषता टेबल.
  2. आप LEFT JOIN . हैं postmeta तालिका ताकि विशेषता गुम होने पर भी आपको एक पंक्ति मिले।
  3. आप postmeta . के लिए किसी अन्य नाम का उपयोग कर रहे हैं टेबल। यहाँ यह है postmeta AS color
  4. आप meta_key . के चयनकर्ता को शामिल कर रहे हैं (यहाँ यह है 'color' = color.meta_key ) ON . में शामिल होने की स्थिति।
  5. आप अपने 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) . पर स्तंभ। यदि आप एक वर्डप्रेस प्लगइन बना रहे हैं, तो शायद प्लगइन स्थापना के समय यह एक काम है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL के Select Last_Insert_ID की थ्रेड सुरक्षा

  2. MySQL में वर्तमान तिथि कैसे प्राप्त करें

  3. MySQL में कई-से-अनेक संबंध

  4. {} PHP में MySQL क्वेरी को कैसे प्रभावित करता है?

  5. मैं अपनी MySQL संग्रहीत प्रक्रिया में लेनदेन का उपयोग कैसे कर सकता हूं?