选择多个没有AS(别名)的表?

时间:2011-01-10 02:09:42

标签: php mysql select

我需要从多个具有大量字段的表中进行SELECT。我是否必须手动制作这样的查询:

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']将只包含第二个表中记录的值。

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

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

4 个答案:

答案 0 :(得分:2)

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

所以,总而言之,你可以这样做:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

是的,有解决方法。 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)));

因此,您可以使用table1。*并能够区分冲突的列名。

另外,另一个技巧是有效的,因为结果集中的列顺序是确定性的。

select 'table1' table_sep1
       table1.*
       'table1' table_sep2
       table2.*

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

答案 3 :(得分:0)

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

$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);
}

如果真的需要它,这可能是一个肮脏的解决方法,以区分您在上面迭代时所在的表:select 1 as _t1_, t1.*, 1 as _t2_, t2.* from t1, t2。虚拟列指示表列开始的位置。