【问题标题】:How to get table name from mysql result?如何从mysql结果中获取表名?
【发布时间】:2017-04-25 18:29:04
【问题描述】:

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 列,可能会有所不同。
如何通过修改查询来达到结果?

【问题讨论】:

  • 嗨。修改SELECT 部分。 SELECT t1.id as id, t1.column as colum1, t3.column3 as column3, ...
  • 一个表有超过 15 列,可能因表而异
  • 好的。这是不可能的......直接:)但是,您可以使用一些技巧。例如:分析表结构 (SHOW COLUMNS),并通过添加 t1.id as t1_id, t1.c1 as t1_c1, t2.id as t2_id, ... 动态创建 SQL 查询。这是一些 ORM 使用的技巧。

标签: php mysql join inner-join


【解决方案1】:

进行查询后,您可以创建一个 foreach 循环来获取所有列名。像这样的

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

更新

如果您想在数据库中获取表名,可以尝试这样的方法。

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

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

更新

首先我们需要获取我们的表名。由于您不知道表名,因此我们可以使用此代码获取表名

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

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

如果你有表格,你可以将它们添加到数组中,跳过上面的代码

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

根据您的需要更新代码。这是一个例子

【讨论】:

  • 我想在每个结果中获取表名作为另一个数据。正如你在 foreach 循环中所说的
  • 您想从多个表中获取所有数据但表名不多?这就是你想要达到的目标?
  • 是的,我需要从多个表中获取所有数据(列可能会有所不同),包括作为数据一部分的相应表名。
  • 好吧,完美,这不是问题。您知道进行选择需要哪些列吗?我的意思是从中选择用户、通行证、ID、日期......
  • 由于超过15列,可能与table tot table不同,我们需要选择所有列
【解决方案2】:

另一种解决方案(某些 ORM 使用)

1。创建表列表

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

2。执行 SHOW COLUMNS FROM table 分析表

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 将重命名不同的字段。

例如:['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,
    )
)

您还可以将每个 $key 结果拆分为具有表或创建多维数组:)

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 1970-01-01
    • 2020-09-30
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多