Php 是否选择不带AS(别名)的多个表?

Php 是否选择不带AS(别名)的多个表?,php,mysql,select,Php,Mysql,Select,我需要从多个有很多字段的表中进行选择。我是否必须像这样手动创建查询: table1.field1 AS table1_field1, table1.field2 AS table1_field2, ..., table2.field1 AS table2_field1, ... 或者,在MySQL或PHP中是否有任何解决方法可以在表中有相同的字段名时自动处理所有这些问题 在PHP中,我尝试: $results = $conn -> query("SELECT table1.*, tabl

我需要从多个有很多字段的表中进行选择。我是否必须像这样手动创建查询:

table1.field1 AS table1_field1, table1.field2 AS table1_field2, ..., table2.field1 AS table2_field1, ...
或者,在MySQL或PHP中是否有任何解决方法可以在表中有相同的字段名时自动处理所有这些问题

在PHP中,我尝试:

$results = $conn -> query("SELECT table1.*, table2.* FROM table1, table2 WHERE 1"); // $conn is a mysqli object
$results = $results -> fetch_array();
但是,如果两个表中都有一个名为“title”的字段,$results['title']将只包含第二个表中记录的值

我知道您可以使用数字索引来访问值,但是:

这是不可读的。 每次表结构(如字段顺序)发生更改时,都必须相应地更新代码。
有什么想法吗?

没有,SQL中没有动态生成列别名的约定。如果需要它们,您需要逐个定义它们。

请注意,您只需要使用两个表中出现的名称对字段进行别名,甚至只需要对第二列进行别名。此外,如果只需要其中一个表中的字段,则可以在要检索的字段列表中仅包含该字段。最后,您可以使用一个较短的名称为每个表名本身别名,然后可以在列别名中使用该名称

总而言之,你可以做如下事情:

 SELECT t1.id, t1.title, t2.title as second_title, t2.somethingelse
    FROM  table1 t1 INNER JOIN table2 t2. . .

是的,有一些变通办法。 mysql和mysqli扩展,以及某些pdo驱动程序,都有一些函数可以让您获取列元数据。这是一个pdo样品

$stmt->execute();
$qualifiedColumnNames = array();
for ($i = 0; $i < $stmt->columnCount(); $i++) {
    $columnMeta = $stmt->getColumnMeta($i);
    $qualifiedColumnNames[] = "$columnMeta[table].$columnMeta[name]";
}

print_r(array_combine($qualifiedColumnNames, $stmt->fetch(PDO::FETCH_NUM)));

我将把代码留给您,但是您可以获取一行作为数组,并循环遍历数组键。因为它们是按顺序排列的,所以您可以假设表分隔符列后面的每一列都属于该分隔符指定的表,直到遇到下一个sep。

您可以迭代数值索引并检查每个索引的名称:

$result = mysql_query('select t1.*, t2.* from t1, t2');
$num = mysql_num_fields($result);
for ($i = 0; $i < $num; $i++) {
    $column_name = mysql_field_name($result, $i);
}

如果您确实需要它,这可能是一个棘手的解决方法,可以在上面迭代时区分您所在的表:从t1,t2中选择1作为_t1,t1.*,1作为_t2,t2.*。指示表列开始位置的伪列。

MySQL通过返回所有字段的所有值来正常工作,即使有相同的字段名。然而,PHP似乎覆盖了所有具有相同字段名数组索引的内容,因为$results->fetch\u数组总是返回一个数组,因此值会被相同的索引字段名覆盖。在PHP@kavoir.com中有没有解决这个问题的方法?@kavoir.com:是的,SQL支持不同表中具有相同名称的列,只要它们附加了表名或别名引用,否则会出现不明确的列引用错误。我不擅长PHP,但这取决于SQL/MySQL支持什么。
$result = mysql_query('select t1.*, t2.* from t1, t2');
$num = mysql_num_fields($result);
for ($i = 0; $i < $num; $i++) {
    $column_name = mysql_field_name($result, $i);
}