sql >> Database >  >> RDS >> Mysql

Hoe u grote gegevenssets uit meerdere tabellen kunt ophalen en herhaalde query's kunt voorkomen?

Ervan uitgaande dat uw 7 tabellen zijn gekoppeld door id's, doe dan zoiets als dit

Eerste vraag

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

Voer vervolgens een foreach uit en kies de id's die u in de volgende zoekopdracht wilt gebruiken in een door komma's gescheiden variabele (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!

nu voor je tweede tabel, krijg je, met slechts 1 query, alle waarden die je nodig hebt om mee te doen (niet door mysql, we doen dit met php)

Tweede vraag

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

Dan hoeven we alleen de twee arrays programmatisch samen te voegen.

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

nu hebben we de array $result_a_and_b met dit formaat:

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

dus met 2 zoekopdrachten hebben we een resultaat vergelijkbaar met TABLE_A_ROWS_NUMBER + 1 (een is de eerste zoekopdracht van de eerste tabel)

Blijf op deze manier zoveel niveaus doen als je wilt.

  1. Query database met de id die de tabel linkt
  2. haal de id's in CSV-tekenreeks
  3. doe de volgende zoekopdracht met WHERE id IN(11,22,33,44,55,.....)
  4. programmatisch deelnemen

Tip:U kunt unset() . gebruiken om geheugen vrij te maken op tijdelijke variabelen.

Ik geloof dat ik in uw vraag "Is er een manier om de database niet zo vaak te raadplegen?" . heb beantwoord

opmerking:code niet getest op typefouten, misschien heb ik een komma of twee gemist -of misschien niet

ik geloof dat je het punt kunt begrijpen :) hoop dat het helpt!



  1. Recursieve zoekopdracht in Oracle

  2. Tabellen opsommen die worden gebruikt in mysql-query?

  3. Verschil tussen CTE en SubQuery?

  4. Hoe een volledige externe join te doen in MySQL