当前位置: 首页 > 面试题库 >

SQL Select *从多个表

封瑞
2023-03-14
问题内容

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

例:

SELECT * from table1,table2;

给出:

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

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


问题答案:

是的你可以。最简单的方法是使用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中测试)-合格的列名将使用表别名。



 类似资料:
  • 我正试图掌握mysqli对象及其工作方式。我使用上面的查询查找数据库的表名,并将它们插入select下拉列表。当我使用类似的代码填充另一个select下拉列表时,我使用在while循环运行时获取结果。然后我的select语句是当我使用上面的select语句时,我需要使用索引0而不是“table\u name”。为什么呢?当我在PHP MyAdmin中运行上面的select语句时,我得到了一个行名为

  • 我只是在尝试使用更复杂的语句时修补SQL。我不知道这是否符合条件,但请指导如何进行。 我已经研究了连接和一些关于多个Select语句的问题,但无法正确理解它们。 我有以下两张表: emp表: 图书目录: 其中books表中的是引用emp表的外键。 我需要从特定组织的books表中获取所有记录。但除此之外,我还需要在结果中获得各个员工的所有数据,如姓名、地址。 请给我指引正确的方向。 谢谢

  • 问题内容: 考虑2个或更多表: 我希望删除所有与名字“ Sam ”匹配的 用户 及其 订单 。在mysql中,我通常会做左连接。在此示例中,我们不知道userid。 查询的正确格式是什么? 问题答案: http://www.postgresql.org/docs/current/static/sql- delete.html 您也可以使用 http://www.postgresql.org/doc

  • 我正在使用hibernate 4和Spring 3。 我有5个表,每个表映射一个实体类。现在,如果我必须从1个表中选择列,我将执行以下操作: 此结果中的此值将为EmployeeEntity类型。 或者我也可以使用标准。 现在我的要求是我必须从所有5个表中得到结果。每个表中有1-2列。 早些时候,它是一个1表,所以我得到了一个实体,现在我得到了5个表的结果,所以如何在实体中映射它。 List res

  • 问题内容: 嘿,我有一个连接两个不相关表的Junction表。两个表都有。我需要使用不同的值从每个表中选择,例如,这就是我的看法: 我见过的所有示例都使用一条语句,但是两个表具有相同的值,在这种情况下,它们不是。 问题答案: 试试这个查询:

  • 问题内容: 我正在尝试使用SQL从连接在一起的多个表中删除多行。 表A连接到表B表B连接到表C 我想删除表B和C中与表A中的一行相对应的所有行 问题答案: 好吧,如果您使用过InnoDB表,则可以使用外键设置级联删除,这将自动完成所有操作。但是,如果您出于某种原因使用MyISAM,则只需使用多表DELETE即可: