sql >> Databáze >  >> RDS >> Mysql

Jak načíst velké sady dat napříč více tabulkami a vyhnout se cyklickým dotazům

Za předpokladu, že je vašich 7 tabulek propojeno pomocí ID, udělejte něco takového

První dotaz

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

Poté proveďte foreach a vyberte ID, která chcete použít v dalším dotazu, v proměnné oddělené čárkami (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!

nyní pro vaši druhou tabulku získáte, pouze 1 dotazem, všechny hodnoty, které potřebujete k JOIN (ne pomocí mysql, uděláme to s php)

Druhý dotaz

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

Pak už jen potřebujeme programově spojit dvě pole.

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

nyní máme pole $result_a_and_b s tímto formátem:

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

takže se 2 dotazy máme výsledek podobný TABLE_A_ROWS_NUMBER + 1 (jeden je počáteční dotaz první tabulky)

Takto pokračujte v provádění tolika úrovní, kolik chcete.

  1. Dotaz na databázi s ID, které propojuje tabulku
  2. získejte ID v řetězci CSV
  3. proveďte dotaz v další možnosti pomocí WHERE id IN(11,22,33,44,55,.....)
  4. připojit se programově

Tip:Můžete použít unset() pro uvolnění paměti pro dočasné proměnné.

Domnívám se, že jsem ve vaší otázce odpověděl "Existuje způsob, jak nedotazovat databázi tak často?"

poznámka:kód nebyl testován na překlepy, možná jsem vynechal čárku nebo dvě - nebo možná ne

Věřím, že to pochopíte :) doufám, že to pomůže!



  1. org.apache.openjpa.persistence.ArgumentException při spuštění hlavní třídy

  2. Woocommerce získat ID produktu pomocí SKU produktu

  3. phpMyAdmin hází #2002 nelze se přihlásit k serveru mysql phpmyadmin

  4. Lze MySQL FIND_IN_SET nebo ekvivalent nastavit tak, aby používal indexy?