sql >> データベース >  >> RDS >> Mysql

複数のテーブルにまたがる大量のデータを取得し、クエリのループを回避する方法

    7つのテーブルがIDでリンクされていると仮定して、次のようにします

    最初のクエリ

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

    次に、foreachを実行し、次のクエリで使用するIDをコンマ区切り変数(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!
    

    これで、2番目のテーブルに対して、JOINに必要なすべての値を1つのクエリで取得できます(mysqlではなく、phpでこれを行います)

    2番目のクエリ

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

    次に、プログラムで2つのアレイを結合する必要があります。

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

    これで、次の形式の配列$result_a_and_bが作成されました。

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

    したがって、2つのクエリを使用すると、TABLE_A_ROWS_NUMBER + 1のような結果になります(1つは最初のテーブルの最初のクエリです)

    このようにあなたが望むだけ多くのレベルをやり続けます。

    1. テーブルをリンクするIDを使用してデータベースをクエリします
    2. CSV文字列でIDを取得する
    3. WHERE id IN(11,22,33,44,55、.....)を使用して次の可能性のクエリを実行します
    4. プログラムで参加する

    ヒント:unset()を使用できます 一時変数のメモリを解放します。

    私はあなたの質問に答えたと思います「データベースにそれほど頻繁にクエリを実行しない方法はありますか?」

    注:コードはタイプミスについてテストされていません。コンマを1つか2つ見逃したか、そうでないかもしれません

    私はあなたがポイントを得ることができると信じています:)それが役立つことを願っています!



    1. mysqli_query()は、少なくとも2つのパラメーターを想定しています。1つは?

    2. mysqlでデータベースを削除するにはどうすればよいですか?データベースの名前を知らなくてもDROPDATABASE()

    3. mysqlを使用したC#で問題が発生した場合、トランザクションはロールバックされませんか?

    4. MS AccessでIDEを最新化するのを手伝ってください–あなたの投票が重要です!