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

एकाधिक तालिकाओं में डेटा के बड़े सेट को कैसे पुनर्प्राप्त करें और लूपिंग प्रश्नों से कैसे बचें

मान लें कि आपके 7 टेबल आईडी से जुड़े हुए हैं, ऐसा कुछ करें

पहली क्वेरी

'SELECT * FROM table_a WHERE a_id IN (12,233,4545,67676,898999)'
// store the result in $result_of_first_query

फिर एक फ़ोरैच करें और उन आईडी को चुनें जिन्हें आप अगली क्वेरी में कॉमा सेपरेटेड वेरिएबल (सीएसवी) में उपयोग करना चाहते हैं

foreach($result_of_first_query as $a_row_from_first_table)
{
    $csv_for_second_query = $csv_for_second_query.$a_row_from_first_table['b_id'].",";
}

$csv_for_second_query = trim($csv_for_second_query,", "); // problem is we will have a lot of duplicate entries
$temp_arr = array(); // so lets remove the duplicates
$temp_arr = explode(",",$csv_for_second_query);  // explode values in array
$temp_arr = array_unique($temp_arr);  // remove duplicates
$csv_for_second_query = implode(",",$temp_arr);  // create csv string again. ready!

अब आपकी दूसरी तालिका के लिए, आपको केवल 1 क्वेरी के साथ वे सभी मान मिलेंगे जिनकी आपको जॉइन करने की आवश्यकता है (mysql द्वारा नहीं, हम इसे php के साथ करेंगे)

दूसरी क्वेरी

'SELECT * FROM table_b where a_id IN ('.$csv_for_second_query.')'
// store the result in $result_of_second_query;

फिर हमें केवल दो सरणियों को प्रोग्रामेटिक रूप से जोड़ने की आवश्यकता है।

$result_a_and_b = array(); // we will store the joined result of every row here

// lets scan every row from first table
foreach($result_of_first_query as $inc=> $a_row_from_first_table)
{
    // assign every row from frist table to result_a_and_b 
    $result_a_and_b[$inc]['a']=$a_row_from_first_table;

    $inc_b=0; // counter for the joins that will happen by data from second table

    // for every row from first table we will scan every row from second table
    // so we need this nested foreach
    foreach($result_of_second_query as $a_row_from_second_table)
    {
        // are data need to join? if yes then do so! :)
        if($a_row_from_first_table['a_id']==$a_row_from_second_table['a_id'])
        {
            $result_a_and_b[$inc]['b'][$inc_b]=$a_row_from_second_table; // "join" in our "own" way :)
            ++$inc_b; // needed for the next join
        }
    }
}

अब हमारे पास इस प्रारूप के साथ $result_a_and_b सरणी है:

$result_a_and_b[INDEX]['a']
$result_a_and_b[INDEX]['b'][INDEX]

इसलिए 2 प्रश्नों के साथ, हमारे पास TABLE_A_ROWS_NUMBER + 1 के समान परिणाम है (एक पहली तालिका की प्रारंभिक क्वेरी है)

इस तरह आप जितने चाहें उतने स्तर करते रहें।

  1. तालिका को लिंक करने वाली आईडी के साथ क्वेरी डेटाबेस
  2. आईडी को CSV स्ट्रिंग में प्राप्त करें
  3. WHERE id IN(11,22,33,44,55,.....)
  4. का उपयोग करके अगली सक्षम में क्वेरी करें
  5. कार्यक्रम में शामिल हों

युक्ति:आप unset() . का उपयोग कर सकते हैं अस्थायी चर पर स्मृति मुक्त करने के लिए।

मेरा मानना ​​है कि मैंने आपके प्रश्न का उत्तर दिया है "क्या डेटाबेस को इतनी बार क्वेरी न करने का कोई तरीका है?"

नोट:टाइपो के लिए कोड का परीक्षण नहीं किया गया है, हो सकता है कि मैं एक अल्पविराम से चूक गया या दो -या शायद नहीं

मुझे विश्वास है कि आप बात समझ सकते हैं :) आशा है कि यह मदद करता है!



  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 क्वेरी का मुद्रण परिणाम

  2. मेरा MySQL ट्रिगर काम नहीं करता, सरल सिंटैक्स, जटिल नहीं

  3. INT फ़ील्ड पर LIKE तुलना करना

  4. जहां INNER JOIN . से पहले क्लॉज

  5. इस SQL ​​​​कोड में तालिका में कैसे शामिल हों?