0

列名とフィールド値に基づいてすべて連携するデータベース テーブルのリストがあります。

単純なプライマリ ID 列のフィールド値の一致で、テーブルの約 3/4 を取得できます。

現在プルアップできるテーブルを使用して、テーブル全体の列の一致に基づいて残りのデータを取得できるようにしたいと考えています。

アイデアを開始しました..しかし、プロセスを完了する方法がよくわかりません。

この Web サイトは WordPress を使用していますが、理想的には、WordPress データベース クラスを使用せずに、そのままの PHP でこれを行うことができます。

学校に関するすべての情報を取得します。 $school = $this->get_school('129020');

機能: ( $this->get_school($id);)

private function get_school($id){
    global $wpdb;
    /* Retrieve the IPEDS database tables. */
    $columns = $this->map_database('iped');
    /* Retrieve the initial results by the UNITID. */
    $data = array();
    foreach($columns['UNITID']['shared_tables'] as $table){
        $data[$table] = $wpdb->get_results(
            "
            SELECT *
            FROM `{$table}`
            WHERE `UNITID` = '{$id}';
            ", 
            ARRAY_A
        );
    }
    return $data;
}

機能: ( $this->map_database($database_table))

private function map_database($database_table = 'all'){
    global $wpdb;
    /* Get all of the database tables. */
    $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
    $table_columns = array();
    foreach($tables as $table){
        if($database_table != 'all'){
            /* Filter tables by partial string matching the table name. */
            if(stripos($table[0], $database_table) === false){
                continue;
            }
        }
        /* Get all of the columns available in each database table. */
        $columns = $wpdb->get_results(
            "
            SELECT *
            FROM   information_schema.columns
            WHERE  table_name = '{$table[0]}'
            ORDER  BY ordinal_position  
            ",
            ARRAY_A
        );
        for($i = 0; $i < count($columns); $i++){
            $column = $columns[$i];
            /* Don't overwrite any data. Could result in missing or overlapping of data? */
            if(isset($table_columns[$table[0]]) && in_array($column['COLUMN_NAME'], $table_columns[$table[0]])){
                continue;
            }
            $table_columns[$table[0]][] = $column['COLUMN_NAME'];
        }
    }
    return $this->map_database_tables($tables, $table_columns);
}

機能: ( $this->map_database_tables($database_tables, $database_consolidated);)

/* 
$database_tables - Array consisting of strictly database tables. 
$database_consolidated - Nested array consisting of: table_name => table_columns
*/      
private function map_database_tables($database_tables, $database_consolidated){
    if(empty($database_tables) || empty($database_consolidated)){
        return;
    }
    $common_columns = array();

    foreach($database_consolidated as $table_name => $table_columns){
        for($i = 0; $i < count($table_columns); $i++){
            $table_column = $table_columns[$i];
            /* Find similar table columns in other database tables. */
            $search = $this->search_database_tables($database_consolidated, $table_column);
            if(!empty($search)){
                foreach($search as $column => $table){
                    $common_columns[$table_column]['shared_tables'] = $table;
                }
            }
        }
    }
    return $common_columns;
}

機能: ( $this->search_database_tables($tables, $column_name);)

/* Returns column name and database tables sharing the column name. */
private function search_database_tables($tables, $column_name){
    $common_tables = array();
    foreach($tables as $table_name => $table_columns){
        if(in_array($column_name, $table_columns)){
            $common_tables[$column_name][] = $table_name;
        }
    }
    return $common_tables;
}

次の形式の配列になります。

$database_map = array(
    'table_name' => array(
        'row_number' => array(
            'field_key' => 'field_value'
        )
    )
);

私が困惑しているのは、次に何をすべきかです。これでどこに行けばいいですか?

指先にすべてのデータがありますが、次に何をすべきか困惑しています。

これが私が考えていたことですが、間違いなくいくつかのガイダンスまたは入力が必要です.....

他のテーブル列の値を確認したいと思います。したがって、たとえば、プライマリ ID 番号によってまだプルされていない他のテーブルの 1 つにのみ存在するセカンダリ ID 番号を検索している場合。

テーブル 1 には、「Secondary」という列と「123」というフィールド値があるとします。

「セカンダリ」列が存在するかどうかを確認するために、他のすべてのデータベース テーブルを循環させたいと考えています。存在する場合は、一致する列名と、その列名の 2 つのテーブル フィールド値のフィールド値に基づいて、そのテーブルからすべてのフィールドを取得します。

私のコードは絶対にひどいものであり、おそらく大幅に簡素化できると確信しています。目的の目標をすでに達成している可能性のある既存のフレームワークをいくつか探しました。私は何かを見つけるのにこれほどの幸運はありませんでした。

私のコードで次にどこに行くべきかについてのアドバイスをお待ちしています。また、使用できる既存のフレームワークについてもオープンです。

4

0 に答える 0