一尘不染

SQL Select *从多个表

mysql

使用PHP / PDO / MySQL是否可以在对多个表进行选择并且返回的数组键完全合格以避免列名冲突时对列使用通配符?

例:

SELECT * from table1,table2;

给出:

数组键是“ table1.id”,“ table2.id”,“ table1.name”等。

我尝试使用“ SELECT table1。,table2。 …”,但是返回的数组键不完全合格,因此具有相同名称的列会发生冲突并被覆盖。


阅读 1523

收藏
2020-05-17

共1个答案

一尘不染

是的你可以。最简单的方法是使用pdo,尽管至少还有一些其他扩展可以使用它。

do

PDO对象而不是PDOStatment上设置属性。

$PDO->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, true);

而已。然后,您将获得类似的关联数组键$row['myTable.myColumn']。如果您也获取了一个对象(例如,通过PDO::FETCH_OBJECT),则请注意,因为您需要访问诸如$obj->{'myTable.myColumn'}

  • 手册说PDO::ATTR_FETCH_TABLE_NAMES属性仅受某些驱动程序支持。如果上述方法不起作用,则 可以 代替。

    $pdoStatement->setFetchMode(PDO::FETCH_NUM);
    $pdoStatement->execute();
    //build our associative array keys
    $qualifiedColumnNames = array();
    for ($i = 0; $i < $pdoStatement->columnCount(); $i++) {
    $columnMeta = $pdoStatement->getColumnMeta($i);
    $qualifiedColumnNames[] = “$columnMeta[table].$columnMeta[name]”;
    }

    //fetch results and combine with keys
    while ($row = $pdoStatement->fetch()) {
    $qualifiedRow = array_combine($qualifiedColumnNames, $row);
    print_r($qualifiedRow);
    }


其他数据库扩展使用相同的基本模式

MySQL的

$res = mysql_query($sql);
//build our associative array keys
$qualifiedColumnNames = array();
for ($i = 0; $i < mysql_num_fields($res); $i++) {
    $columnMeta = mysql_fetch_field($res, $i);
    $qualifiedColumnNames[] = "$columnMeta[table].$columnMeta[name]";
}

//fetch results and combine with keys
while ($row = mysql_fetch_row($res)) {
    $qualifiedRow = array_combine($qualifiedColumnNames, $row);
    print_r($qualifiedRow);
}

mysqli

$res = $mysqli->query($sql);
//build our associative array keys
$qualifiedColumnNames = array();
foreach ($res->fetch_fields() as $columnMeta) {
    $qualifiedColumnNames[] = "{$columnMeta->table}.{$columnMeta->name}";
}

//fetch results and combine with keys
while ($row = $res->fetch_row()) {
    $qualifiedRow = array_combine($qualifiedColumnNames, $row);
    print_r($qualifiedRow);
}

这也应该与表别名一起使用(在php 7.1中测试)-合格的列名将使用表别名。

2020-05-17