Mysql
 sql >> Database >  >> RDS >> Mysql

Come recuperare grandi insiemi di dati su più tabelle ed evitare query in loop

Supponendo che le tue 7 tabelle siano collegate da ID, fai qualcosa del genere

Prima domanda

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

Quindi fai un foreach e scegli gli ID che desideri utilizzare nella query successiva in una variabile separata da virgole (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!

ora per la tua seconda tabella, otterrai, con una sola query, tutti i valori di cui hai bisogno per JOIN (non da mysql, lo faremo con php)

Seconda domanda

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

Quindi dobbiamo solo unire a livello di codice i due array.

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

ora abbiamo l'array $result_a_and_b con questo formato:

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

quindi con 2 query, abbiamo un risultato simile a TABLE_A_ROWS_NUMBER + 1 (una è la query iniziale della prima tabella)

In questo modo continua a fare tutti i livelli che vuoi.

  1. Interroga il database con l'id che collega la tabella
  2. ottenere gli ID nella stringa CSV
  3. esegui una query in modo successivo utilizzando WHERE id IN(11,22,33,44,55,.....)
  4. Unisciti a livello di codice

Suggerimento:puoi usare unset() per liberare memoria sulle variabili temporanee.

Credo di aver risposto alla tua domanda "C'è un modo per non interrogare il database così spesso?"

nota:codice non testato per errori di battitura, forse ho perso una virgola o due -o forse no

credo che tu possa ottenere il punto :) spero che aiuti!