Zakładając, że twoje 7 stołów jest połączonych identyfikatorami, zrób coś takiego
Pierwsze zapytanie
'SELECT * FROM table_a WHERE a_id IN (12,233,4545,67676,898999)'
// store the result in $result_of_first_query
Następnie wykonaj foreach i wybierz identyfikatory, których chcesz użyć w następnym zapytaniu w zmiennej rozdzielanej przecinkami (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!
teraz dla drugiej tabeli otrzymasz, za pomocą tylko jednego zapytania, wszystkie wartości potrzebne do JOIN (nie przez mysql, zrobimy to za pomocą php)
Drugie zapytanie
'SELECT * FROM table_b where a_id IN ('.$csv_for_second_query.')'
// store the result in $result_of_second_query;
Następnie wystarczy programowo połączyć dwie tablice.
$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
}
}
}
teraz mamy tablicę $result_a_and_b w następującym formacie:
$result_a_and_b[INDEX]['a']
$result_a_and_b[INDEX]['b'][INDEX]
więc przy 2 zapytaniach mamy wynik podobny do TABLE_A_ROWS_NUMBER + 1 (jedno to początkowe zapytanie pierwszej tabeli)
W ten sposób rób tyle poziomów, ile chcesz.
- Zapytanie bazy danych o identyfikatorze, który łączy tabelę
- pobierz identyfikator w ciągu CSV
- wykonaj zapytanie w następnym stanie, używając WHERE id IN(11,22,33,44,55,.....)
- dołącz programowo
Wskazówka:możesz użyć unset()
aby zwolnić pamięć na zmiennych tymczasowych.
Wydaje mi się, że odpowiedziałem na Twoje pytanie „Czy istnieje sposób, aby nie odpytywać bazy tak często?”
uwaga:kod nie został przetestowany pod kątem literówek, może pominąłem przecinek lub dwa -a może nie
wierzę, że możesz zrozumieć :) mam nadzieję, że to pomoże!