我有一个数据库表列表,它们都根据列名和字段值一起工作。
我可以使用简单的主ID列字段值匹配来提取大约3/4的表。
使用我当前能够提取的表格,我希望能够根据表格中可能的列匹配来检索其余数据。
我已经开始了一个想法..但我不太确定如何完成这个过程。
这个网站正在使用WordPress,但理想情况下,这仍然可以通过直接的PHP完成,而无需使用WordPress数据库类。
检索有关学校的所有信息:
$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号,该号码仅存在于尚未被主ID号提取的其他表中。
表1可能有一个名为“Secondary”的列,字段值为“123”。
我想循环遍历所有其他数据库表,以查看是否存在“辅助”列。如果是,则根据该列名称的两个表字段值的匹配列名和字段值,从该表中提取所有字段。
我确信我的代码绝对可怕,可能会大大简化。我已经找到了一些可能已达到我预期目标的现有框架。我找不到任何东西都没有运气。
我愿意接受我的代码下一步的建议。我也对可以使用的任何现有框架持开放态度。