Angenommen, Ihre 7 Tabellen sind durch IDs verknüpft, tun Sie so etwas:
Erste Abfrage
'SELECT * FROM table_a WHERE a_id IN (12,233,4545,67676,898999)'
// store the result in $result_of_first_query
Führen Sie dann eine Suche durch und wählen Sie die IDs aus, die Sie in der nächsten Abfrage in einer durch Kommas getrennten Variable (csv) verwenden möchten
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!
Jetzt für Ihre zweite Tabelle erhalten Sie mit nur 1 Abfrage alle Werte, die Sie zum JOIN benötigen (nicht mit MySQL, wir werden dies mit PHP tun)
Zweite Abfrage
'SELECT * FROM table_b where a_id IN ('.$csv_for_second_query.')'
// store the result in $result_of_second_query;
Dann müssen wir die beiden Arrays nur programmgesteuert verbinden.
$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
}
}
}
Jetzt haben wir das Array $result_a_and_b mit diesem Format:
$result_a_and_b[INDEX]['a']
$result_a_and_b[INDEX]['b'][INDEX]
mit 2 Abfragen haben wir also ein Ergebnis ähnlich TABLE_A_ROWS_NUMBER + 1 (eines ist die anfängliche Abfrage der ersten Tabelle)
Machen Sie auf diese Weise so viele Level, wie Sie möchten.
- Datenbank mit der ID abfragen, die die Tabelle verknüpft
- erhalten Sie die IDs im CSV-String
- Fragen Sie in der nächsten Tabelle mit WHERE id IN(11,22,33,44,55,.....)
- Programmgesteuert beitreten
Tipp:Sie können unset()
verwenden um Speicher für temporäre Variablen freizugeben.
Ich glaube, ich habe Ihre Frage beantwortet "Gibt es eine Möglichkeit, die Datenbank nicht so oft abzufragen?"
Hinweis:Code nicht auf Tippfehler getestet, vielleicht habe ich ein oder zwei Kommas übersehen - oder vielleicht auch nicht
Ich glaube, Sie können den Punkt verstehen :) Ich hoffe, es hilft!