转置来自 3 个不同数据库表的列值的二维数组

问题描述 投票:0回答:3

我有三个 MySQL 表,我需要查询它们的所有行。从每个表中获取所有行后,我需要创建一个多维数组,其中该数组的每个索引仅包含每个表中的值。我现在所拥有的有效。但是,有件事告诉我必须有更好的方法来实现这一目标。

$tables = array('table_one', 'table_two', 'table_three');
$final = array();

foreach($tables as $table) {
    $sql = "SELECT * FROM ".$table."";
    $query = mysqli_query($con, $sql)or die(mysqli_error($con));
    $num = mysqli_num_rows($query);
    $i = 0;

    while($row = mysql_fetch_array($query)) {
        $id[$i] = $row['user_id'];

        $i++;
    }

    for ($i = 0; $i < $num; $i++) {
       if (!is_array($final[$i])) {
            $final[$i] = array($id[$i]);
       } else {
            array_push($final[$i], $id[$i]);
       }
    }
}

最终结果是这样的

$final = array(
    array('table_one_row_one_val', 'table_two_row_one_val', 'table_three_row_one_val'),
    array('table_one_row_two_val', 'table_two_row_two_val', 'table_three_row_two_val'),
    array('table_one_row_three_val', 'table_two_row_three_val', 'table_three_row_three_val')
);

我有一种直觉,这可以更有效地完成,但我不确定如何做。

php arrays multidimensional-array transpose resultset
3个回答
1
投票

如果您使查询更明确地按照您想要的顺序选择所需的列,则可以使您的代码更简单。例如:

$sql = 'SELECT table_one.user_id as u1, table_two.user_id as u2, table_three.user_id as u3 FROM ' . implode(',', $tables);

然后结果集的每一行都将以正确的顺序排列列,从而减少数组的构建。例如:

$query = mysqli_query($con, $sql)or die(mysqli_error($con));

while($row = mysql_fetch_array($query)) {
    $final[] = array($row['u1'], $row['u2'], $row['u3']);
}

这些数组中数据的顺序和关系可能存在问题(特别是如果所有 3 个表的行数不同),但根据上面的信息,这是您可以处理它的另一种方法。无论如何,还是要考虑一下。


0
投票

试试这个:

$sql = "SELECT 'user_id' FROM ".$table;

0
投票

关于:

$tables = array('table_one', 'table_two', 'table_three');
$final = array();

foreach($tables as $tableIndex => $table) {
    $sql = "SELECT user_id FROM ".$table;
    $query = mysqli_query($con, $sql)or die(mysqli_error($con));
    $i = 0;

    while($row = mysql_fetch_array($query)) {
        $final[$tableIndex][$i] = $row['user_id'];
        $i++;
    }
}

最好只选择您将使用的列。 SELECT * 不是一个好的 SQL 实践。

© www.soinside.com 2019 - 2024. All rights reserved.