sql >> Databasteknik >  >> RDS >> Mysql

Hur man hämtar stora uppsättningar data över flera tabeller och undviker en looping av frågor

Förutsatt att dina 7 tabeller är länkade av ID, gör något så här

Första frågan

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

Gör sedan en foreach och välj de ID du vill använda i nästa fråga i en kommaseparerad variabel (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 för ditt andra bord får du, med bara en fråga, alla värden du behöver för att JOIN (inte av mysql, vi kommer att göra detta med php)

Andra frågan

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

Sedan behöver vi bara programmera samman de två arrayerna.

$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 har vi arrayen $result_a_and_b med detta format:

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

så med 2 frågor har vi ett resultat som liknar TABLE_A_ROWS_NUMBER + 1 (en är den första frågan i den första tabellen)

Så här fortsätt göra så många nivåer du vill.

  1. Frågedatabas med id som länkar tabellen
  2. hämta ID:n i CSV-strängen
  3. gör fråga i nästa kunna med WHERE id IN(11,22,33,44,55,.....)
  4. gå med programmatiskt

Tips:Du kan använda unset() för att frigöra minne på tempvariabler.

Jag tror att jag svarade i din fråga "Finns det ett sätt att inte fråga databasen så ofta?"

Obs:koden är inte testad för stavfel, jag kanske missade ett kommatecken eller två - eller kanske inte

jag tror att du kan förstå poängen :) hoppas det hjälper!



  1. Vad är T-SQL?

  2. GI 12.2 Ändringar

  3. Skapa en topplistor, hur skulle jag gå tillväga för att visa rang/position?

  4. Överlappande kontrollbegränsning för datumintervall