2016-12-10 2 views
1

Запрос MySQL заключается в следующемКак получить имя таблицы из результата mysql?

SELECT t1.*, t2.*, t3.*, t4.*, t5.*, t6.* FROM table1 t1 INNER JOIN table2 t2 INNER JOIN table3 t3 INNER JOIN table4 t4 INNER JOIN table5 t5 INNER JOIN table6 t6 order by t1.updated_time, t2.updated_time, t3.updated_time, t4.updated_time, t5.updated_time, t6.updated_time desc

из приведенного выше запроса я нужен результат с их соответствующим именем таблицы, как

Array( [0] => stdClass Object ( [id] => 1 [cloumn1] => data1 [column2] => table3 [updated_time] => data1 ) [1] => stdClass Object ( [id] => 2 [cloumn1] => data1 [column2] => table1 [updated_time] => data2 ) )

Таблицы имеют более 15 столбцов, которые могут варьироваться в зависимости ,
Как добиться результата, изменив запрос?

+0

Привет. Измените часть 'SELECT'. 'SELECT t1.id как id, t1.column as colum1, t3.column3 as column3, ...' –

+0

В таблице содержится более 15 столбцов, которые могут отличаться от таблицы к таблице –

+0

Ok. Это невозможно ... прямо :) Но вы можете использовать некоторые трюки. Пример: проанализируйте структуру таблицы ('SHOW COLUMNS') и динамически создайте свой SQL-запрос, добавив' t1.id как t1_id, t1.c1 как t1_c1, t2.id как t2_id, ... '. Это советы, используемые некоторыми ORM. –

ответ

0

После того, как вы сделаете свой запрос, вы можете сделать цикл foreach, чтобы получить все имена столбцов. Что-то вроде этого

while($row = mysqli_fetch_assoc($query)){ 
    foreach($row as $key => $value){ 
     echo "$key=$value"; 
    } 
} 
Update 

Если вы хотите, чтобы ваши имена таблиц в базе данных, вы можете попробовать что-то вроде этого.

$sql = "SHOW TABLES FROM database"; 
$result = mysqli_query($conn,$sql); 

while ($row = mysqli_fetch_row($result)) { 
    echo "Table: {$row[0]}\n"; 
} 

Update

Сначала мы должны получить наши имена таблиц. Так как вы не знаете названия таблиц мы можем получить с помощью этого кода

$tables = array(); 
$sql = "SHOW TABLES FROM database"; 
$result = mysqli_query($conn,$sql); 

while ($row = mysqli_fetch_row($result)) { 
    $tables[] = $row[0]; 
} 

если у вас есть таблицы, которые вы можете добавить их в массив skiping код выше

$tables = array("table1","table2","table3"); 

После того, как все таблицы можно начать с базы данных

$data = array(); 
foreach($tables as $table){ 
    $query = "select * from $table"; 
    $res = mysqli_query($conn,$query); 
    while($row = mysqli_fetch_assoc($res)){ 
     $i=1; 
     foreach($row as $key => $value){ 
      $data[$i][$key][$value]; 
      $i++; 
     } 
    } 
} 

Обновите код в соответствии с вашими нуждами. Это пример

+0

Я хочу получить имя таблицы в качестве другого данных в каждом результате. как вы сказали в цикле foreach –

+0

Вы хотите получить все данные из нескольких таблиц, но имена таблиц не так много? Это то, что вы хотите достичь? –

+0

yes Мне нужно получить все данные из нескольких таблиц (столбцы могут отличаться), включая соответствующее имя таблицы как часть данных. –

1

Другое решение (используемое некоторыми ОРМ)

1. Создать список таблиц

<?php $tables = ['table1', 'table2', 'table3']; ?> 

2. Execute SHOW COLUMNS FROM таблицы для анализа таблиц

http://dev.mysql.com/doc/refman/5.7/en/show-columns.html

<?php 
$structures = []; 
$structuresLinear = []; 
foreach($tables as $table) { 
    $query = mysqli_query('SHOW TABLES FROM ' . $table); 

    while ($row = mysqli_fetch_row($query)) { 
    $structures[$table][] = $row[0]; 
    $structuresLinear[] = sprintf('%s.%s as %s', $table, $row[0], $table . '_' . $row[0]); 
    } 
} 

У вас будет на вашем $structures все поля для каждой таблицы, а другая $structuresLinear с переименованными полями.

Ex: ['table1.id as table1_id', 'table1.name as table1_name', ...]

3.Создайте свой окончательный запрос

<?php 
$sql = 'SELECT '; 
$sql .= implode(', ', $structuresLinear); 
$sql .= ' FROM ' . implode(' INNER JOIN ', $tables); 
$sql .= ' ORDER BY ' . implode(', ', 
    array_map(function($t) { 
    return $t . '.updated_time'; 
    }, $tables) 
); 

?> 

Выход

Вы будете иметь что-то вроде этого:

SELECT 
    table1.id as table1_id, 
    table2.id as table2_id, table2.col2 as table2_col2, table2.col3 as table2_col3 
FROM table1 
    INNER JOIN table2 
ORDER BY 
    table1.updated_time, 
    table2.updated_time 

И окончательный массив будет:

Array(
    [0] => Array(
     table1_id = table1.id, 
     table2_id = table2.id, 
     table2_col2 = table2.col2, 
     table2_col3 = table2.col3, 
    ) 
) 

Вы также можете разделить каждый $ ключевой результат для таблицы или создания многомерного массива :)

Смежные вопросы