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 и изберете идентификаторите, които искате да използвате в следващата заявка в променлива, разделена със запетая (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!

сега за вашата втора таблица ще получите само с 1 заявка всички стойности, които трябва да JOIN (не чрез 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. присъединете се програмно

Съвет:Можете да използвате 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. Номериране на редове с p:dataTable

  2. PHP/PDO вмъкване на текуща дата плюс един месец в MYSQL

  3. Защо даденият синтаксис е валиден в mysql?

  4. Може ли първичният ключ по подразбиране да бъде NULL? Защо е описано като такова?

  5. Показване на mysql данни в html таблица PHP