php - SQL 从多个表中选择 *

标签 php sql mysql database pdo

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

示例:

SELECT * from table1, table2;

给出:

数组键是'table1.id'、'table2.id'、'table1.name'等

我尝试了“SELECT table1.*,table2.* ...”,但返回的数组键不是完全限定的,因此具有相同名称的列发生冲突并被覆盖。

最佳答案

是的,你可以。最简单的方法是使用 pdo,尽管至少有一些其他扩展能够做到这一点。

pdo

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

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

就是这样。然后你会得到像 $row['myTable.myColumn'] 这样的关联数组键。如果您也获取对象(例如通过 PDO::FETCH_OBJECT),它会起作用,所以要小心,因为您需要访问 $obj->{'myTable.myColumn'} 之类的属性

*manual says 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 中测试)——限定的列名将使用表别名。

关于php - SQL 从多个表中选择 *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2523631/

相关文章:

javascript - 如何选择多个行值

sql - 我怎么记得在 CONNECT BY 查询中 PRIOR 应该走哪条路

sql - 甲骨文 : min max values within a repeating group

mysql - MySQL使用auto_increment时出错

php - jquery append 没有正确附加样式图标

php - 如何使用 PHP 对 MySQL 表中的每一列求和

php - 尝试在 Magento 1.7 数据库中查询客户 "company"值

sql - 如何从 SQL 可用性组监听器中删除监听器 IP

php - 多选复选框显示表记录

PHP如何在不同的列中保存多个上传图片名称和路径?