Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara mengambil kumpulan data besar di beberapa tabel dan menghindari kueri perulangan

Dengan asumsi 7 tabel Anda ditautkan oleh id, lakukan sesuatu seperti ini

Permintaan pertama

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

Kemudian lakukan foreach dan pilih id yang ingin Anda gunakan dalam kueri berikutnya dalam variabel yang dipisahkan koma (csv)

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!

sekarang untuk tabel kedua Anda, Anda akan mendapatkan, dengan hanya 1 kueri semua nilai yang Anda butuhkan untuk BERGABUNG (bukan dengan mysql, kami akan melakukannya dengan php)

Permintaan kedua

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

Kemudian kita hanya perlu menggabungkan kedua array secara terprogram.

$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
        }
    }
}

sekarang kita memiliki array $result_a_and_b dengan format ini:

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

jadi dengan 2 kueri, kami memiliki hasil yang mirip dengan TABLE_A_ROWS_NUMBER + 1 (satu adalah kueri awal tabel pertama)

Seperti ini terus lakukan sebanyak mungkin level yang Anda inginkan.

  1. Database kueri dengan id yang menautkan tabel
  2. dapatkan id dalam string CSV
  3. lakukan query selanjutnya dapat menggunakan WHERE id IN(11,22,33,44,55,.....)
  4. bergabung secara terprogram

Tip:Anda dapat menggunakan unset() untuk membebaskan memori pada variabel temp.

Saya yakin saya menjawab pertanyaan Anda "Apakah ada cara untuk tidak sering menanyakan database?"

catatan:kode tidak diuji untuk kesalahan ketik, mungkin saya melewatkan satu atau dua koma -atau mungkin tidak

saya yakin Anda bisa mendapatkan intinya :) semoga membantu!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Transaksi MySQL dengan aplikasi akuntansi

  2. Bagaimana cara melakukan ping ke MySQL db dan menghubungkan kembali menggunakan PDO

  3. Hubungan MySQL

  4. Kesalahan MySQL 150, tidak dapat membuat tabel

  5. Menggunakan Pernyataan yang Disiapkan, bagaimana saya mengembalikan id dari baris yang dimasukkan?