Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách truy xuất tập hợp dữ liệu lớn trên nhiều bảng và tránh truy vấn lặp lại

Giả sử 7 bảng của bạn được liên kết bằng id, hãy làm như sau

Truy vấn đầu tiên

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

Sau đó, thực hiện foreach và chọn id bạn muốn sử dụng trong truy vấn tiếp theo trong một biến được phân tách bằng dấu phẩy (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!

bây giờ đối với bảng thứ hai của bạn, bạn sẽ nhận được, chỉ với 1 truy vấn tất cả các giá trị bạn cần để THAM GIA (không phải bằng mysql, chúng tôi sẽ thực hiện điều này với php)

Truy vấn thứ hai

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

Sau đó, chúng ta chỉ cần nối hai mảng theo chương trình.

$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
        }
    }
}

bây giờ chúng ta có mảng $ result_a_and_b với định dạng này:

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

vì vậy với 2 truy vấn, chúng tôi có kết quả tương tự như TABLE_A_ROWS_NUMBER + 1 (một là truy vấn ban đầu của bảng đầu tiên)

Như thế này tiếp tục làm bao nhiêu cấp độ bạn muốn.

  1. Cơ sở dữ liệu truy vấn với id liên kết bảng
  2. lấy id trong chuỗi CSV
  3. thực hiện truy vấn tiếp theo có thể sử dụng WHERE id IN (11,22,33,44,55, .....)
  4. tham gia theo chương trình

Mẹo:Bạn có thể sử dụng unset() để giải phóng bộ nhớ trên các biến tạm thời.

Tôi tin rằng tôi đã trả lời trong câu hỏi của bạn "Có cách nào để không truy vấn cơ sở dữ liệu thường xuyên không?"

lưu ý:mã không được kiểm tra lỗi chính tả, có thể tôi đã bỏ sót một hoặc hai dấu phẩy hoặc có thể không

Tôi tin rằng bạn có thể hiểu được ý kiến ​​:) hy vọng nó có ích!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. xóa các mục nhập trùng lặp trong bảng

  2. Truy vấn được sửa đổi với ManyToMany

  3. Chiến lược đặt tên ngủ đông thay đổi tên bảng

  4. Các bảng cơ sở dữ liệu động trong django

  5. Truy vấn MySQL cho nhiều giá trị hộp kiểm