【问题标题】:How to fetch result from MySQL row with multiple same-name columns with PHP? [duplicate]如何使用 PHP 从具有多个同名列的 MySQL 行中获取结果? [复制]
【发布时间】:2010-11-27 20:50:06
【问题描述】:
select * from A left join B on A.columnc=B.columnd

上述SQL返回的结果会包含A列和B列。

如果 A 和 B 有一些同名的列呢?

如何从 PHP 中获取值?

【问题讨论】:

  • 您会收到一个错误,说明列不明确 - 数据库无法判断要使用名称相同的两个列中的哪一个。
  • @rexem:那不是真的。 SQL 是绝对正确的,如果查询显式选择了两个表中都存在的列名,但没有指定表前缀,则会发生错误。

标签: php sql mysql


【解决方案1】:

您可能希望在查询中更加明确。这样您就可以为您的列提供别名:

SELECT
  A.foo as a_foo,
  B.foo as b_foo
FROM A
LEFT JOIN B ON A.columnc = B.columnd

【讨论】:

  • 如果您只需要第二个表中的几列,您可以(无论如何在 mysql 中)执行类似“SELECT a.*, b.column_that_also_exist_in_a as someAliase ...”的操作
  • @tim:应该能够在任何符合 ANSI 的数据库系统中执行此操作。
【解决方案2】:

答案其实在PHP documentation

"如果结果的两列或多列具有相同的字段名称,则最后一列将优先。要访问同名的其他列,您需要使用数字索引访问结果mysql_fetch_row() 或添加别名。参见mysql_fetch_array() 关于别名的说明中的示例。"

当您坚持在 select 语句中使用星号时,尤其是 mysql_fetch_array() 似乎是最佳人选:

$row = mysql_fetch_array($result, MYSQL_BOTH) 

然后您可以通过$row[name] 引用明确的字段,并通过$row[col_number] 引用不明确的字段,但这会限制您的代码的可移植性(也许下一版本的 MySQL 会以不同的顺序返回列?)。推荐的解决方案是重写您的查询并列出所有必填字段,而不是使用星号和模棱两可的字段 - 使用别名。

【讨论】:

    【解决方案3】:

    您应该在 select 语句中使用column aliases

    【讨论】:

      【解决方案4】:

      在来自 ResultSet 对象的 Java+MySQL 中,您可以使用例如 getString("a.id") 和 getString("b.id"),如果您的查询类似于“SELECT a.id, b.id”从 a,b"

      我不知道 PHP 中是否有类似的东西。

      问候

      【讨论】:

        【解决方案5】:

        这可能对某些人有用:因为我使用了一些模板,所以我不能每次都轻松地使用别名,并且我想要关联数组以方便使用。 CREDIT PILCROW 对how to mysql_fetch_array on joined tables, but columns have same name 的回答,但在 MySQLi 中:

        $qualified_names = array();
        for ($i = 0; $i < mysqli_num_fields($result); ++$i) {
            $fieldinfo=mysqli_fetch_field_direct($result,$i);
            $table = $fieldinfo->table;
            $field = $fieldinfo->name;
            $qualified_names["$table.$field"]="$table.$field";
        }
        $newrow = array_combine($qualified_names, mysqli_fetch_array($result,MYSQLI_NUM));
        

        【讨论】:

          猜你喜欢
          • 2013-07-16
          • 2022-01-24
          • 2019-04-30
          • 1970-01-01
          • 2017-04-25
          • 1970-01-01
          • 1970-01-01
          • 2020-11-05
          • 1970-01-01
          相关资源
          最近更新 更多