Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So rufen Sie große Datensätze über mehrere Tabellen hinweg ab und vermeiden Schleifenabfragen

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.

  1. Datenbank mit der ID abfragen, die die Tabelle verknüpft
  2. erhalten Sie die IDs im CSV-String
  3. Fragen Sie in der nächsten Tabelle mit WHERE id IN(11,22,33,44,55,.....)
  4. 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!