Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak pobrać duże zestawy danych z wielu tabel i uniknąć zapętlonych zapytań

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.

  1. Zapytanie bazy danych o identyfikatorze, który łączy tabelę
  2. pobierz identyfikator w ciągu CSV
  3. wykonaj zapytanie w następnym stanie, używając WHERE id IN(11,22,33,44,55,.....)
  4. 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!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql nie zlicza wierszy dwa razy, jeśli dane w kolumnie są zduplikowane

  2. Odpowiednik explode() do pracy z ciągami w MySQL

  3. Przypisanie identyfikatora użytkownika php nie działa

  4. Wstaw perską wartość do tabeli z kodem php

  5. Nieparzyste i parzyste rzędy na stół