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

एक ही क्वेरी में पोस्ट और टैग के लिए क्वेरी

बेहतर होगा कि आप group_concat समाधान क्योंकि यह चरित्र की लंबाई के कारण विश्वसनीय नहीं है, इसमें 1024 वर्णों की एक डिफ़ॉल्ट सीमा है, लेकिन इसे बढ़ाया जा सकता है जिसे मैनुअल लेकिन आप पूरी तरह से परिभाषित सीमा पर भरोसा नहीं कर सकते हैं, इसके बजाय आप इसे अपने एप्लिकेशन लेयर (php) में संभाल सकते हैं जैसे आप डेटा ला रहे हैं और कहीं आप पोस्ट और इसके संबंधित टैग प्रदर्शित करना चाहते हैं, तो आप अभी भी पोस्ट द्वारा ऑर्डर के साथ अपनी जॉइन क्वेरी का उपयोग कर सकते हैं। एक से अधिक टैग हो सकते हैं इसलिए परिणाम सेट में डुप्लिकेट पोस्ट डेटा होगा क्योंकि प्रत्येक पोस्ट पंक्ति में एक टैग होगा और उसी पोस्ट वाली दूसरी पंक्ति में दूसरा टैग होगा और इसी तरह अब जब आप अपने परिणामों के माध्यम से लूप करते हैं तो प्रत्येक पोस्ट को केवल एक बार प्रदर्शित करते हैं कुछ चेक जोड़ना

$this->db->select('p.*,t.*');
$this->db->from('posts p');
$this->db->join('tags_map tm', 't.id_post = p.id');
$this->db->join('tags t', 't.id = tm.id_tag');
$this->db->order_by('p.id asc,t.id asc');
$results = $this->db->get();

उपरोक्त क्वेरी में मैंने t.* . जोड़ा है लूप में अब सभी पोस्ट और उससे संबंधित टैग का चयन करने के लिए $currentParent लूप चेक में पिछली पोस्ट आईडी होगी यदि यह एक ही पोस्ट है तो इसके टैग प्रदर्शित करें यदि स्थिति झूठी है तो यह मार्कअप (एच 1) का उपयोग करके एक नया पोस्ट डिस्प्ले पोस्ट शीर्षक है, मैंने दोनों टेबल से सभी कॉलम चुने हैं लेकिन आपको केवल आवश्यक जोड़ना चाहिए टैग टेबल से कॉलम और यदि पोस्ट और टैग टेबल में एक ही नाम के कॉलम हैं तो क्वेरी में उन्हें अलग-अलग उपनाम से परिभाषित किया गया है

$currentParent = false;
foreach ($results as $post) {
    if ($currentParent != $post->id) {
        echo '<h1>' . $post->title . '</h1>';
        $currentParent = $post->id;
    }
    echo '<p>' . $post->name . '</p>'; /** here list tags info*/
    echo '<p>' . $post->tag_other_details . '</p>'; 
    ...
}

परिणामी मार्कअप इस तरह होगा

<h1>Post title 1</h1>
    <p>tag 1</p>
    <p>tag 2</p>
<h1>Post title 2</h1>
    <p>tag 3</p>...

यदि आप डेटा प्रदर्शित नहीं कर रहे हैं और आप इसे कहीं और (वेब ​​सेवा) में उपयोग कर रहे हैं तो अभी भी एक सम्मिलित क्वेरी का उपयोग करें और सरणी/वस्तु बनाकर अपने डेटा को रूपांतरित करें प्रत्येक पोस्ट में इसके संबंधित टैग की एक सरणी नीचे की तरह है

$posts =array();
foreach ($results as $post) {
 $posts[$post->id]['title'] = $post->title;
 $posts[$post->id]['tags'][] =array('id' => $tag->id ,'name' =>$post->name);
}

एक और तरीका है जो अत्यधिक अनुशंसित नहीं है पोस्ट प्राप्त करें और लूप में क्वेरी चलाकर टैग प्राप्त करें अब यह समाधान काम करेगा लेकिन इसमें अवांछित प्रश्न शामिल होंगे ताकि प्रत्येक पोस्ट के लिए एक अतिरिक्त क्वेरी निष्पादित की जा सके।

अब यदि आप वास्तव में group_concat के साथ रहना चाहते हैं आपके प्रश्न का उत्तर देने के लिए दृष्टिकोण I'm not sure if I can trust the order? एक तरीका यह भी है कि आप order by जोड़ सकते हैं group_concat . में ताकि परिणामी संयोजन टैग का आदेश दिया जाएगा और दूसरे कॉलम के लिए आप समान आदेश मानदंड रख सकते हैं

$this->db->select('p.*,group_concat(t.name order by t.id) as thetags,
                       group_concat(t.relevance order by t.id) as therelevances');
$this->db->from('posts p');
$this->db->join('tags_map tm', 't.id_post = p.id');
$this->db->join('tags t', 't.id = tm.id_tag');
$this->db->group_by('p.id');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. php/mysql में डुप्लिकेट पंक्ति प्रविष्टि को रोकना

  2. MySQL वर्कबेंच में एक डेटाबेस को रिवर्स इंजीनियर कैसे करें

  3. डॉकर - विभिन्न वेबसाइटों के लिए होस्ट और कंटेनर पर अपाचे चलाएं

  4. उम्मीद/टीसीएल स्क्रिप्ट में डंप फ़ाइल से MySQL डेटाबेस कैसे बनाएं?

  5. आउटफाइल एक्सेस में MYSQL अस्वीकृत - लेकिन मेरे उपयोगकर्ता के पास सभी एक्सेस हैं .. और फ़ोल्डर CHMOD 777 है