sql >> Base de Datos >  >> RDS >> Mysql

Cómo recuperar grandes conjuntos de datos en varias tablas y evitar consultas en bucle

Suponiendo que sus 7 tablas estén vinculadas por identificadores, haga algo como esto

Primera consulta

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

Luego haga un foreach y elija las identificaciones que desea usar en la siguiente consulta en una variable separada por comas (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!

ahora para su segunda tabla, obtendrá, con solo 1 consulta, todos los valores que necesita para UNIRSE (no por mysql, lo haremos con php)

Segunda consulta

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

Luego, solo necesitamos unir mediante programación las dos matrices.

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

ahora tenemos la matriz $result_a_and_b con este formato:

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

entonces, con 2 consultas, tenemos un resultado similar a TABLE_A_ROWS_NUMBER + 1 (una es la consulta inicial de la primera tabla)

Así sigue haciendo tantos niveles como quieras.

  1. Consulta la base de datos con el id que vincula la tabla
  2. obtener las identificaciones en la cadena CSV
  3. haga la consulta en la siguiente opción usando WHERE id IN(11,22,33,44,55,.....)
  4. unirse programáticamente

Consejo:puedes usar unset() para liberar memoria en variables temporales.

Creo que respondí a tu pregunta "¿Hay alguna forma de no consultar la base de datos con tanta frecuencia?"

nota:código no probado para errores tipográficos, tal vez me perdí una coma o dos, o tal vez no

creo que puedes entender el punto :) ¡espero que te ayude!