SQL从多个表中选择*

zaf*_*zaf 15 php mysql sql database pdo

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

例:

SELECT*from table1,table2;

得到:

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

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

goa*_*oat 14

是的你可以.最简单的方法是使用pdo,尽管至少有一些其他扩展能够实现.

PDO

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

$PDO->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, true);
Run Code Online (Sandbox Code Playgroud)

而已.然后你得到像关联数组键$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);
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

这也适用于表别名(在php 7.1中测试) - 限定列名将使用表别名.

  • 这是一个很棒的工作,你救了我的培根. (2认同)

KM.*_*KM. 5

你可以这样做:

SELECT Table1.*,Table2.xyz, Table2.abc,... From...
Run Code Online (Sandbox Code Playgroud)

您可以使用“*”从一个表中获取所有列,然后只从您需要的另一个表中获取列,因此没有冲突。

您还可以使用列别名,在其中“重命名”列:

SELECT Table1.A AS T1_A,Table2.A AS T2_A,... From...
Run Code Online (Sandbox Code Playgroud)

您的结果集将是列 T1_A 和 T2_A

  • @zaf 如果你不知道列名,你怎么知道哪些是你需要的/哪些被覆盖了? (2认同)